Problem:
Du samlade data i grupper, men du vill sortera posterna i fallande ordning efter antalet element i grupperna.
Exempel:
Vår databas har en tabell som heter user
med data i följande kolumner:id
, first_name
, last_name
och country
.
id | förnamn | efternamn | land |
---|---|---|---|
1 | Lisa | Williams | England |
2 | Gary | Anders | Polen |
3 | Tom | Williams | Polen |
4 | Michael | Brun | Frankrike |
5 | Susan | Smith | USA |
6 | Anne | Jones | USA |
7 | Ellie | Miller | Polen |
Låt oss skapa en rapport om våra användare. Vi grupperar resultaten efter country
och räkna antalet användare från varje land. Men vi kommer också att sortera grupperna i fallande ordning efter antal användare. På så sätt kommer länderna med det största antalet användare att visas överst.
Lösning:
SELECT country, COUNT(id) FROM user GROUP BY country ORDER BY COUNT(id) DESC ;
land | count(id) |
---|---|
Polen | 3 |
USA | 2 |
England | 1 |
Frankrike | 1 |
Diskussion:
För att sortera de valda posterna efter antalet element i varje grupp använder du ORDER BY
klausul.
Det första steget är att använda GROUP BY
sats för att skapa grupperna (i vårt exempel grupperar vi efter country
kolumn). Sedan, i ORDER BY-satsen, använder du aggregatfunktionen COUNT, som räknar antalet värden i den kolumn du väljer; i vårt exempel räknar vi distinkta ID:n med COUNT(id)
. Detta räknar effektivt antalet element i varje grupp. ORDER BY
satsen sorterar sedan grupperna enligt den beräkningen.
Som vanligt kan du använda både stigande och fallande ordning med ORDER BY
. Om du vill ha fallande ordning (som i detta exempel), använder du DESC
nyckelord. Stigande ordning behöver inget nyckelord eftersom det är standard, men du kan använda ASC
nyckelord om du vill vara tydlig. Detta är samma exempel men med resultat sorterade i stigande ordning:
Lösning:
SELECT country, COUNT(id) FROM user GROUP BY country ORDER BY COUNT(id);
Här är resultatet:
land | count(id) |
---|---|
England | 1 |
Frankrike | 1 |
USA | 2 |
Polen | 3 |