Подсчитать вхождения значений DISTINCT


218

Я пытаюсь найти запрос MySQL, который найдет значения DISTINCT в определенном поле, посчитает количество вхождений этого значения и затем упорядочит результаты по количеству.

пример дб

id         name
-----      ------
1          Mark
2          Mike
3          Paul
4          Mike
5          Mike
6          John
7          Mark

ожидаемый результат

name       count
-----      -----
Mike       3
Mark       2
Paul       1
John       1

Ответы:


396
SELECT name,COUNT(*) as count 
FROM tablename 
GROUP BY name 
ORDER BY count DESC;

2
Что именно группа делает здесь? Непонятно, какова цель? Кажется, это должно работать без него, если вы просто читаете это прямо.
Джеймс

19
Хотя запрос Амбер является правильным ответом на этот вопрос, я хотел бы внести поправку в ее комментарий, чтобы не вводить новых людей в заблуждение. Если вы опустите «group by» в запросе MySQL, вы не получите [Mike, 1], [Mike, 1], вы получите один результат, который будет именем возвращенной строки FIRST и счетчиком количество строк в таблице, так что в этом случае [Марк, 7]. count (), поскольку агрегатная функция работает со всем набором данных, суммируя, считая или объединяя указанное поле до одной строки. Группировать по подразделам набора данных на куски, основанные на уникальных комбинациях указанных полей
Avatar_Squadron

3
Что-то, с чем я боролся, было устранение результатов без дубликатов. Вы не можете бросить count(*) > 1в whereпредложение, потому что это агрегатные функции. Вы также получаете очень бесполезное сообщение: «Неправильное использование групповой функции». Правильный путь к псевдониму счетчик name,COUNT(*) as cntи добавить имеющий пункт следующим образом: HAVING count > 1.
Патрик М

4
@PatrickM Да, HAVINGдля условий, которые должны применяться после агрегирования, тогда WHEREкак для условий, которые должны применяться до него. (Еще один способ думать об этом - WHEREприменить к исходным данным строки; HAVINGприменить к выходным данным строки.)
Январь

2
Есть что-то очень приятное в хорошо сконструированном операторе SQL.
Джошуа Пинтер

14

Как насчет чего-то вроде этого:

SELECT
  name,
  count(*) AS num
FROM
  your_table
GROUP BY
  name
ORDER BY
  count(*)
  DESC

Вы выбираете имя и количество раз, которое оно появляется, но группируете по имени, поэтому каждое имя выбирается только один раз.

Наконец, вы заказываете количество раз в порядке DESCending, чтобы на первом месте были наиболее часто появляющиеся пользователи.


Ваш запрос помог мне. В результате он возвращает несколько строк. Я также хотел знать, как найти счет этого результата. Пробовал несколько запросов, но он не может рассчитывать на совокупность. Не могли бы вы помочь с этим?
Нав

@Nav - счет чего? Количество строк возвращается? Это SELECT COUNT(DISTINCT name) as count FROM your_tableдля подсчета общего количества строк в таблице, сделайте запрос Паскаля без group byоператора.
Осень Леонард

Какая разница в минуту!
Чак Ле Батт

6

Просто изменил COUNT (*) Амбер на COUNT (1) для лучшей производительности.

SELECT name, COUNT(1) as count 
FROM tablename 
GROUP BY name 
ORDER BY count DESC;

1
На самом деле то, что вы сказали, является частичным здесь
Джеймс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.