Problem:
Du vill sortera rader efter summor som genereras av en grupp poster.
Exempel:
Vår databas har en tabell som heter training
med data i fyra kolumner:id , logga in , år , och poäng .
id | logga in | år | poäng |
---|---|---|---|
1 | Andy | 2018 | 24 |
2 | Lucy | 2019 | 25 |
3 | Andy | 2019 | 20 |
4 | Lucy | 2018 | 16 |
5 | Gary | 2019 | 18 |
6 | Gary | 2018 | 19 |
7 | Gary | 2017 | 22 |
8 | Lucy | 2017 | 21 |
9 | Andy | 2017 | 26 |
Låt oss få inloggningsnamnet för varje spelare tillsammans med den totala summan av poäng för alla år, och sätter rekord i fallande ordning enligt spelarnas totala poäng.
Lösning:
Vi använder operatorn ORDER BY för att beställa poster baserat på aggregatfunktionen SUM()
, som beräknar den totala poängen för varje spelare under alla år.
Här är frågan du skulle skriva:
SELECT login, SUM(score) AS total_score FROM training GROUP BY login ORDER BY SUM(score) DESC;
Här är resultatet:
logga in | total_score |
---|---|
Andy | 70 |
Lucy | 62 |
Gary | 59 |
Diskussion:
Använd ORDER BY om du vill ordna rader enligt ett värde som returneras av en aggregerad funktion som SUM()
. Operatorn ORDER BY följs av aggregatfunktionen (i vårt exempel, SUM()
). DESC placeras efter denna funktion för att ange en fallande sorteringsordning. Således visas de högsta sammanlagda värdena först och sedan gradvis lägre värden. För att sortera i stigande ordning kan du ange ASC eller helt enkelt utelämna något av sökorden, eftersom stigande är standardsorteringsordningen.
I frågan ovan väljer vi varje spelares inloggning och summan av deras poäng för alla år. Denna totala poäng beräknas med SUM() med poängkolumnen som ett argument. Vi lägger till ett alias för detta aggregerade värde (SUM(score) AS total_score
); du kan använda detta alias istället för aggregatfunktionen i ORDER BY-satsen (ORDER BY total_score DESC
).
Observera att vi inkluderar inloggning i GROUP BY. Om vi inkluderar en kolumn i SELECT måste vi även använda kolumnen i GROUP BY. I det här exemplet använder vi GROUP BY-satsen följt av kolumninloggningen eftersom vi lägger denna kolumn i SELECT. Observera att GROUP BY placeras före ORDER BY i frågan.