Hvordan laver man en Order by Count.(xxx) i en Group by?
$query = "SELECT spillerid, COUNT(spillerid), spillerdatabase.spillernavn FROM maalscorer LEFT JOIN spillerdatabase ON spillerdatabase.id = maalscorer.spillerid GROUP BY spillerid";
Ja sådan ser den ud. Jeg er ingen ørn til mysql eller php, men ovenstående spytter altså en topscorerliste ud. Nemlig via antallet af forekomster af et spillerid. Alt sammen fint.
Men jeg kan ikke rigtig få lov at sortere efter flest forekomster. Det vil sige, jeg vil gerne have antallet af forekomster til at være det der sorteres efter. Så i stedet for "Persona" "4", "Personb" "3", "personc" "5"
skal de spyttes ud i rækkefølge, altså 5 forekomster før, 4 etc
$query = "SELECT spillerid, COUNT(spillerid), spillerdatabase.spillernavn FROM maalscorer LEFT JOIN spillerdatabase ON spillerdatabase.id = maalscorer.spillerid GROUP BY spillerid ORDER BY COUNT(spillerid)";
og
$query = "SELECT spillerid, COUNT(spillerid) AS cnt, spillerdatabase.spillernavn FROM maalscorer LEFT JOIN spillerdatabase ON spillerdatabase.id = maalscorer.spillerid GROUP BY spillerid ORDER BY cnt";
Ja det er rigtigt, arne. Jeg tror bare din forudsætning er forkert. Du har forudsat, at spørgerens forespørgsel kunne køre, som den var beskrevet i spørgsmålet. Men det vil den jo ikke kunne, da han ikke har angivet spillernavn i sin GROUP BY.
Nå nej, der er noget med, at MySQL ikke følger standard SQL her. Den tager vist bare en værdi fra en tilfældig række i gruppesættet, hvis ikke alle felter uden aggregat funktioner bliver specificeret. Den virkemåde virker altid forvirrende på mig, og må da skabe store problemer hvis man efterfølgende skal overføre forespørgsler til andre databaser. Nå, det var bare en strøtanke, og har vist alligevel ikke rigtig nogen relevans.
2 forskellige fejlmeddelser $query = "SELECT spillerid, COUNT(spillerid) AS cnt, spillerdatabase.spillernavn FROM maalscorer LEFT JOIN spillerdatabase ON spillerdatabase.id = maalscorer.spillerid GROUP BY spillerid ORDER BY cnt";
Giver Notice: Undefined index: COUNT(spillerid) in /home/virtual/sports-online.dk/public_html/pages/topscorer.php on line 13 --------------- og
$query = "SELECT spillerid, COUNT(spillerid), spillerdatabase.spillernavn FROM maalscorer LEFT JOIN spillerdatabase ON spillerdatabase.id = maalscorer.spillerid GROUP BY spillerid ORDER BY COUNT(spillerid)";
giver: "Invalid use of group function"
at bytte om på rækkefølge synes ikke at hjælpe.
Kan man ikke forestille sig noget med at tage en Select * from ("hele den query fra før") og så sortere den? Eller er mysql ikke glad for sådan en dobbelt select?
Bare for lige at afprøve min flyvske idé om, at spillernavnet også skal med i GROUP BY:
SELECT spillerid, COUNT(spillerid), spillerdatabase.spillernavn FROM maalscorer LEFT JOIN spillerdatabase ON spillerdatabase.id = maalscorer.spillerid GROUP BY spillerid, spillernavn ORDER BY COUNT(spillerid)
kjulius: det er hel fint i mysql uden spillerid i GROUP BY. Det er ikke SQL-standard og giver fejl stort set alle andre steder. Men det kan fikses når alt det andet virker ;)
Næh, menneskeheden mangler 3 ting: standardiseret SQL, standardiserede støvsugerposer, og standardiserede ispinde-pinde. Så ville alting være meget nemmere. :=)
Det ville jo forudsætte, at spillerid fandtes i begge tabeller. Det ville desuden betyde, at heller ikke forespørgslen i selve spørgsmålet kunne køre. Kun hvis et felt findes i flere tabeller der er brugt i forespørgslen er det nødvendigt med et prefix.
Jeg er taknemmelig for interessen kjulius :D Løsningen du gav 11:55:24 giver "Invalid use of group function"
Erikjacobsens kl 11:33 forstår jeg ikke helt. Jeg har jo netop lavet en "Count(spillerid) AS cnt" og det giver alligevel indexfejlen på Count
prefix til spillerid gør ingen forskel.
Det undrer mig såre at det er så svært at lave den her ting :) Det ender med at jeg må lave den i 2 omgange og oprette en tabel bare til at smide ind i, så jeg kan få lov at lave en Order By. Men det er jo pokkers usmart når det ikke burde være nødvendigt.
Det er ikke linie 13. Du har denne fejl(notice) Notice: Undefined index: COUNT(spillerid) in /home/virtual/sports-online.dk/public_html/pages/topscorer.php on line 13
ah okay, jamen det virker sgu. den linje havde en syntax i stil med <? echo "Der er scoret ". $row['cnt'] "...?> Hvor row['... var Count før.
Jeg bukker og takker for den tålmodige hjælp.
Synes godt om
Ny brugerNybegynder
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.