Проблем:
Обединихте данните в групи, но искате да сортирате записите в низходящ ред по броя на елементите в групите.
Пример:
Нашата база данни има таблица с име user
с данни в следните колони:id
, first_name
, last_name
и country
.
id | first_name | фамилно_име | държава |
---|---|---|---|
1 | Лиза | Уилямс | Англия |
2 | Гари | Андерс | Полша |
3 | Том | Уилямс | Полша |
4 | Майкъл | Кафяв | Франция |
5 | Сюзън | Смит | САЩ |
6 | Ан | Джоунс | САЩ |
7 | Ели | Милър | Полша |
Нека създадем отчет за нашите потребители. Ще групираме резултатите по country
и пребройте броя на потребителите от всяка държава. Но също така ще сортираме групите в низходящ ред по брой потребители. По този начин страните с най-голям брой потребители ще се покажат в горната част.
Решение:
SELECT country, COUNT(id) FROM user GROUP BY country ORDER BY COUNT(id) DESC ;
country | count(id) |
---|---|
Полша | 3 |
САЩ | 2 |
Англия | 1 |
Франция | 1 |
Дискусия:
За да сортирате избраните записи по броя на елементите във всяка група, използвате ORDER BY
клауза.
Първата стъпка е да използвате GROUP BY
клауза за създаване на групите (в нашия пример ние групираме по country
колона). След това в клаузата ORDER BY използвате агрегатната функция COUNT, която отчита броя на стойностите в колоната по ваш избор; в нашия пример ние броим различни идентификатори с COUNT(id)
. Това ефективно отчита броя на елементите във всяка група. ORDER BY
клаузата след това сортира групите според това изчисление.
Както обикновено, можете да използвате както възходящ, така и низходящ ред с ORDER BY
. Ако искате низходящ ред (както в този пример), използвайте DESC
ключова дума. Възходящият ред не се нуждае от ключова дума, защото е по подразбиране, но можете да използвате ASC
ключова дума, ако искате да бъдете изрични. Това е същият пример, но с резултати, сортирани във възходящ ред:
Решение:
SELECT country, COUNT(id) FROM user GROUP BY country ORDER BY COUNT(id);
Ето резултата:
country | count(id) |
---|---|
Англия | 1 |
Франция | 1 |
САЩ | 2 |
Полша | 3 |