07. november 2005 - 17:42Der er
9 kommentarer og 1 løsning
Problmer med LEFT JOIN og NULL, (sortering)
Hejsa
Jeg har et problem med LEFT JOIN og NULL. På en hjemmeside med opskrifter vil jeg gerne hente alle opskrifter, og sortere dem efter deres karakter. Karakteren bliver beregnet udfra en sum og antal af rækker i en anden tabel:
SELECT opskrifter.id as opskriftsid, opskrifter.titel as optitel, (sum(karaktertabel.karakter)/count(karaktertabel.karakter)) as karakter, count(karaktertabel.karakter) as antalstemmer FROM opskrifter LEFT JOIN opskrifter_karakter as karaktertabel ON opskrifter.id = karaktertabel.opskrift WHERE opskrifter.godkendt = '1' GROUP BY opskrifter.id, karaktertabel.opskrift ORDER BY 'karakter' DESC, 'antalstemmer' DESC
Problem er, på nogle MySQL server, at hvis der ikke er givet en karakter, så bliver karakter sat til NULL, vil jeg tror, og når den så sortere, kommer alle række med NULL til at stå over dem med tal, lige meget om den sortere med ASC eller DESC.
Hvordan klare jeg lige den? Evt. så den retunere 0 istedet for NULL?
SELECT opskrifter.id as opskriftsid, opskrifter.titel as optitel, IFNULL((sum(karaktertabel.karakter)/count(karaktertabel.karakter)),0) as karakter, count(karaktertabel.karakter) as antalstemmer FROM opskrifter LEFT JOIN opskrifter_karakter as karaktertabel ON opskrifter.id = karaktertabel.opskrift WHERE opskrifter.godkendt = '1' GROUP BY opskrifter.id, karaktertabel.opskrift ORDER BY 'karakter' DESC, 'antalstemmer' DESC
Det var omkring hvornår det er nødvendigt at bruge IFNULL. På min ene mysql server (4.1.12) kan den godt sortere rigtigt uden brug af IFNULL, mens på min anden, version 3.2.x, kan jeg ikke.
Er der nogen standard for, hvad den skal gøre med NULL, når den skal sortere sammen med tal
Jeg kan ikke huske, hvad standarden siger, men der er nogle DBMS'er, hvor du kan sige at du vil have NULL i toppen eller bunden. I MySQL kan du altid styre det manuelt via IFNULL, og det ville jeg nok gøre hvis jeg var dig. Har ikke den store tiltro til MySQL :)
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.