Avatar billede madsleejensen Nybegynder
19. juli 2007 - 15:25 Der er 8 kommentarer og
1 løsning

Problemmer med en order by left join query

Hej sidder og koger lidt over hvorfor dette ikke fungere som jeg gerne vil

har db1: id / brugernavn / password
har db2: id / brugerId / rating

nu vil jeg gerne have en liste ud med mine brugere sorteret efter deres AVG(db2.rating).

har prøvet med dette men ser ikke ud til den sortere overhovedet.

"select db1.*,AVG( db2.rating ) as AVGRating from db1 LEFT JOIN db2 ON db1.id = db2.brugerId where '1' = '1' GROUP BY db1.id ORDER BY AVGRating DESC limit 0,10"

min where 1 = 1 er bare for at illustere hvor jeg insætter min where's, jeg får en liste på 10 men de er ikke sorteret efter AVG rating i db2.

hva gør jeg forkert :)

mange tak
Avatar billede fennec Nybegynder
19. juli 2007 - 15:33 #1
Alt hvad du har på din select liste som ikke er en aggerat funktion (avg, sum, max...) skal med på din group by. Hvorfor man aldrig bruger * sammen med aggerat funktioner:

"select db1.id, db1.navn ,AVG( db2.rating ) as AVGRating from db1 LEFT JOIN db2 ON db1.id = db2.brugerId where '1' = '1' GROUP BY db1.id, db1.navn ORDER BY AVGRating DESC limit 0,10"
Avatar billede madsleejensen Nybegynder
19. juli 2007 - 15:51 #2
ouch :)

kan da godt nok gå hen og blive en rigtig lang query :)

er der ikke en måde at bruge shorthand * ?
Avatar billede madsleejensen Nybegynder
19. juli 2007 - 16:20 #3
hmmm nu har jeg fundet ud af hva den gør.. den order faktisk men den sætter NULL til at være højere ...
Avatar billede madsleejensen Nybegynder
19. juli 2007 - 16:21 #4
f.eks

null
null
null
null
5
3
2
1

hvordan fixes det :) ?
Avatar billede fennec Nybegynder
19. juli 2007 - 16:27 #5
Du kan smide en IFNULL() på:
"select db1.id, db1.navn , IFNULL(AVG(db2.rating),0) as AVGRating ...

Så returnere den 0 it stedet for NULL
Avatar billede fennec Nybegynder
19. juli 2007 - 16:27 #6
Avatar billede madsleejensen Nybegynder
19. juli 2007 - 16:38 #7
perfekt!!! mange tak for det
smid et svar!
Avatar billede fennec Nybegynder
20. juli 2007 - 09:30 #8
.o) <-- One Eyed Jack
Avatar billede arne_v Ekspert
21. juli 2007 - 00:26 #9
MySQL har en grim lille feature hvor den faktisk tillader felter i SELECT som
hverken er aggregerede eller er i GROUP BY - MySQL tager bare værdien fra en tilfældig
række.
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