Avatar billede totalpc Seniormester
10. marts 2021 - 08:18 Der er 15 kommentarer og
1 løsning

Får en tilfældig ID

Hej

Jeg har konstrueret denne select:

SELECT id, month(fdato), year(fdato), medlemsnr, navn, art, max(vaegt) from ct_storfanger_indberetninger_copy where YEAR(fdato)=2020 and godkendt=1 and storfanger=1 AND month(fdato) = 3 group by art, medlemsnr

Jeg får det korrekt data, på nær i ID. Der får jeg er tilfældigt. Jeg kan godt se problemet i select'en, men jeg kan ikke finde ud af at løse det. Nogen der kan?
Avatar billede Rune1983 Ekspert
10. marts 2021 - 09:01 #1
ORDER BY vaegt DESC
?
Avatar billede totalpc Seniormester
10. marts 2021 - 09:06 #2
Giver stadig en forkert ID. Id kommer fra en vægt der ikke er max.
Avatar billede claes57 Ekspert
10. marts 2021 - 09:39 #3
når du har "ct_storfanger_indberetninger_copy" er der så også en original "ct_storfanger_indberetninger" ? og har de de samme id'er ?
Avatar billede Rune1983 Ekspert
10. marts 2021 - 10:03 #4
Burde man ikke gribe den an på anden vis. Du må have en medlem tabel.

SELECT m.medlemsnr, m.navn, f.art MAX(f.vaegt), month(f.fdato), year(f.fdato)
FROM MedlemmerTabel m

INNER JOIN ct_storfanger_indberetninger_copy f
ON f.medlemsnr  = m.medlemsnr
AND YEAR(f.fdato)=2020

GROUP BY f.art
Avatar billede totalpc Seniormester
10. marts 2021 - 10:36 #5
Her er indholdet af ct_storfanger_indberetninger_copy med where clause:

SELECT id, medlemsnr, art, vaegt from ct_storfanger_indberetninger_copy where YEAR(fdato)=2020 and godkendt=1 and storfanger=1 AND month(fdato) = 3

id    medlemsnr    art    vaegt   
398    72        Laks    7500*   
399    34        Laks    6420*   
400    2901    Laks    5600   
401    29        Laks    10400   
403    29        Laks    12750*   
404    2901    Laks    11250*   


Det jeg så gerne vil have ud er ID på den største vægt, pr art, pr medlemsnr
Så i ovenstående vil jeg gerne have dem med * udtrukket.
Med min query får jeg sådan set de rigtige data, men med forkert ID.
Jeg får nemlig det her ud:

SELECT id, medlemsnr, art, max(vaegt) from ct_storfanger_indberetninger_copy where YEAR(fdato)=2020 and godkendt=1 and storfanger=1 AND month(fdato) = 3 group by art, medlemsnr


id        medlemsnr    art        max(vaegt)   
401            29        Laks    12750   
399            34        Laks    6420   
398            72        Laks    7500   
400            2901    Laks    11250   

Hvor I kan se at ID for medlemsnr 29 burde være 403 og ikke 401.
Avatar billede Rune1983 Ekspert
10. marts 2021 - 11:10 #6
Kunne du ik lige prøve følgende

SELECT id, medlemsnr, art, max(vaegt) from ct_storfanger_indberetninger_copy where YEAR(fdato)=2020 and godkendt=1 and storfanger=1 AND month(fdato) = 3 group by art, medlemsnr
ORDER BY medlemsnr ASC, vaegt DESC
Avatar billede totalpc Seniormester
10. marts 2021 - 11:57 #7
Rune1983>
id    medlemsnr      art    max(vaegt)   
401    29        Laks    12750   
399    34        Laks    6420   
398    72        Laks    7500   
400    2901    Laks    11250   

Stadig forkert ID
Avatar billede arne_v Ekspert
10. marts 2021 - 14:46 #8
Først det basale omkring GROUP BY.

Generel GROUP BY syntax er:

SELECT felt1,...,feltn, aggrfunc(something),...,aggrefunc(somethingelse) FROM tabel GROUP BY felt1,...,feltn

Altså select listen skal kun indeholde felter fra griup by listen og aggregerende funktioner.

Hvis man putter andre felter i select listen så:

MySQL - databasen vælger værdi fra en tilfældig række blandt de rækker som matcher group by felterne

de fleste andre database - fejl
Avatar billede arne_v Ekspert
10. marts 2021 - 14:49 #9
Løsningen for dig må være at lave en query som går efter de rækker hvor vaegt er størst.
Avatar billede totalpc Seniormester
10. marts 2021 - 15:02 #10
@arne_v
Tak for input og jeg kender godt til at der er den forskel på fx MS SQL Server og MySQL. Jeg fik også læst mig til at, som du skriver, at MySQl så vælger en tilfældig (i det her tilfælde) ID.

Men jeg søger hjælp til at lave den forespørgsel uanset hvordan den så ser ud. Jeg kan ikke få noget til at virke. Men det kan vel ikke passe at det ikke kan lade sig gøre?
Avatar billede arne_v Ekspert
10. marts 2021 - 15:17 #11
Prøv og byg på dette:

SELECT * FROM ct_storfanger_indberetninger_copy sfi1 WHERE vaegt = (SELECT MAX(vaegt) FROM ct_storfanger_indberetninger_copy sfi2 WHERE sfi2.id = sfi1.id)
Avatar billede arne_v Ekspert
10. marts 2021 - 15:18 #12
Det giver saa et problem hvis der er to id med samme max vaegt.

Men så smider du en group by oven på.
Avatar billede totalpc Seniormester
10. marts 2021 - 15:29 #13
Tak jeg prøver lige.
Avatar billede acore Ekspert
10. marts 2021 - 20:18 #14
mysql garanterer ikke værdien af felter, der er med i SELECT men ikke med i GROUP BY. Nyere versioner giver fejl, når man prøver, medmindre only-full_group_by er disabled.

I dit tilfælde løser det ingenting. så dit query skal omskrives til fx:

SELECT
  fisk.id, t.nr, t.art, fisk.vaegt
FROM
  ct_storfanger_indberetninger_copy fisk
  INNER JOIN (
    SELECT
      nr, art, MAX(vaegt) AS maxvaegt
    FROM
      ct_storfanger_indberetninger_copy
    WHERE
      YEAR(fdato)=2020 AND godkendt=1 and storfanger=1 AND month(fdato) = 3
    GROUP BY
      nr, art
  ) t ON fisk.nr = t.nr AND fisk.vaegt = t.maxvaegt;

(ikke testet og der er sikkert fejl i)

Jeg mener bestemt, at problemet har været oppe herinde før, og at arne_v kom med løsningen, men jeg kan ikke lige finde hans post - måske andre kan?
Avatar billede totalpc Seniormester
11. marts 2021 - 11:08 #15
@acore
Skulle bare ændre nr til medlemsnr i dit, så virkede det lige ud af boksen.
Jeg havde i mellemtiden fået lavet denne som også virker.

select ori.* from
(select medlemsnr,max(vaegt) as vaegt from ct_storfanger_indberetninger_copy where storfanger=1 and godkendt =1 and month(fdato)=3 and year(fdato)=2020 group by medlemsnr) as base
join ct_storfanger_indberetninger_copy as ori
ON
base.medlemsnr = ori.medlemsnr and
  base.vaegt = ori.vaegt

Jeg kan ikke gennemskue om der vil være en forskel i de 2 løsninger, som vil komme til udtryk på et tidspunkt?
Avatar billede acore Ekspert
11. marts 2021 - 11:29 #16
(beklager - jeg ikke havde set arne_v's før jeg skrev mit indlæg - han forklarer det jo)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester