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?
Rune1983 Guru
10. marts 2021 - 09:01 #1
ORDER BY vaegt DESC
?
totalpc Seniormester
10. marts 2021 - 09:06 #2
Giver stadig en forkert ID. Id kommer fra en vægt der ikke er max.
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 ?
Rune1983 Guru
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
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.
Rune1983 Guru
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
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
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
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.
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?
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)
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å.
totalpc Seniormester
10. marts 2021 - 15:29 #13
Tak jeg prøver lige.
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?
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?
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)
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.

Opret Preview

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





Premium
Atea stormer frem: Her er de 20 it-leverandører som branchen mener har de bedste produkter, ydelser og service
Computerworld Image 2021: Disse 20 selskaber leverer ifølge det professionelle it-Danmark de bedste produkter, de bedste ydelser og har den bedste service. Se listen her.
Computerworld
Nu er de her: Efter flere års rygter lancerer Apple Airtags
Langt om længe kan du købe Apples Airtags. De kan modstå støv og vand, og samtidig gør de det muligt for millioner af iPhone-brugere at hjælpe dig med at finde dine nøgler.
CIO
Har du rost din mellemleder i dag? Snart er de uddøde - og det er et tab
Computerworld mener: Mellemledere lever livet farligt: Topledelsen får konstant ideer med skiftende hold i virkeligheden, og moden går mod flade agile organisationer. Men mellemlederen er en overset hverdagens helt med et kæmpe ansvar. Her er min hyldest til den ofte latterliggjorte mellemleder.
Job & Karriere
"Vi var nødt til at sige til dem, at I er nødt til at sende ham hjem nu, for han begynder at knække"
"Vi var nødt til at sige til dem, at I er nødt til at sende ham hjem nu, for han begynder at knække"
White paper
Salesforce er blevet populær hos IT-kriminelle – luk sikkerhedshullerne før det går galt
Mange bygger en stor del af deres IT-strategi på Salesforce, men glemmer at sikre cloudplatformen. Læs her, hvordan du forebygger ødelæggende angreb og kritiske datatab.