Avatar billede sreddy Nybegynder
01. juni 2007 - 20:18 Der er 20 kommentarer

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

Hvordan?

Skal man evt lave en query ekstra eller noget?
Avatar billede arne_v Ekspert
01. juni 2007 - 20:32 #1
der er kun 2 muligheder:

$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";
Avatar billede sreddy Nybegynder
01. juni 2007 - 22:43 #2
Jeg havde i forvejen prøvet faktisk begge dele, og det giver altså fejl i begge tilfælde.
Avatar billede dkfire Nybegynder
02. juni 2007 - 00:30 #3
Prøv evt at bytte om på ORDER BY og GROUP BY, ved ikke helt om det har noget at gøre.
Avatar billede arne_v Ekspert
02. juni 2007 - 06:05 #4
Mystisk - det bør virke.

Hvilken fejl får du ?
Avatar billede kjulius Novice
02. juni 2007 - 10:16 #5
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.
Avatar billede sreddy Nybegynder
02. juni 2007 - 11:24 #6
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?
Avatar billede erikjacobsen Ekspert
02. juni 2007 - 11:33 #7
Brug navnet "cnt" i i stedet for "COUNT(spillerid)" i linie 13
Avatar billede kjulius Novice
02. juni 2007 - 11:55 #8
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)
Avatar billede erikjacobsen Ekspert
02. juni 2007 - 12:03 #9
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 ;)
Avatar billede erikjacobsen Ekspert
02. juni 2007 - 12:03 #10
ØÆh ... uden spillernavn ... mente jeg måske nok ....
Avatar billede kjulius Novice
02. juni 2007 - 12:05 #11
Ja, det var nok det jeg mente, men jeg tænkte i min naivitet, at det måske var noget andet, når aggregat funktionen skulle bruges til at sorteres på.
Avatar billede erikjacobsen Ekspert
02. juni 2007 - 12:11 #12
Næh, menneskeheden mangler 3 ting: standardiseret SQL, standardiserede støvsugerposer, og standardiserede ispinde-pinde. Så ville alting være meget nemmere. :=)
Avatar billede dkfire Nybegynder
02. juni 2007 - 20:38 #13
Kunne det tænkes at spillerid mangler en tabel prefix ala maalscorer.spillerid
Avatar billede kjulius Novice
02. juni 2007 - 22:20 #14
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.
Avatar billede kjulius Novice
02. juni 2007 - 22:22 #15
sreddy, har du efterprøvet alle vore mere eller mindre intelligente indlæg?
Avatar billede sreddy Nybegynder
03. juni 2007 - 00:22 #16
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.
Avatar billede erikjacobsen Ekspert
03. juni 2007 - 00:53 #17
Du kan jo bare prøve hvad jeg foreslår. Og forstå det en anden gang. Eller vise os koden i linie 13.
Avatar billede sreddy Nybegynder
03. juni 2007 - 10:35 #18
Øh ja, men den er jo mere eller mindre logisk nok således.
$result = mysql_query($query) or die(mysql_error());
Avatar billede erikjacobsen Ekspert
03. juni 2007 - 10:40 #19
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
Avatar billede sreddy Nybegynder
03. juni 2007 - 12:37 #20
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.
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