Порахуйте кількість значень DISTINCT


218

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

приклад db

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
Хоча запит Амбер є правильною відповіддю на питання, я хотів би внести виправлення в її коментар, щоб уникнути збиття нових людей. Якщо ви залишите "групу" в запиті MySQL, ви не отримаєте [Майк, 1], [Майк, 1], ви отримаєте єдиний результат, який буде ім'ям у ПЕРШОМУ рядок, що повертається, і кількість кількості рядків у таблиці, тому в цьому випадку [Марк, 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

@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.