Policz wystąpienia wartości DISTINCT

218

Próbuję znaleźć kwerendę MySQL, która znajdzie wartości DISTINCT w określonym polu, policzy liczbę wystąpień tej wartości, a następnie uporządkuje wyniki według liczby.

przykład db

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

Spodziewany wynik

name       count
-----      -----
Mike       3
Mark       2
Paul       1
John       1
JimmyJ
źródło

Odpowiedzi:

396
SELECT name,COUNT(*) as count 
FROM tablename 
GROUP BY name 
ORDER BY count DESC;
Bursztyn
źródło
2
Czym dokładnie jest grupa, robiąc tutaj? Nie jest jasne, jaki jest cel? Wydaje się, że powinno to działać bez problemu, jeśli po prostu czytasz to po prostu.
James
19
Chociaż pytanie Amber jest poprawną odpowiedzią na pytanie, chciałbym poprawić jej komentarz, aby uniknąć zwodzenia nowych ludzi. Jeśli odrzucisz „grupuj według” w zapytaniu MySQL, nie otrzymasz [Mike, 1], [Mike, 1], otrzymasz pojedynczy wynik, który będzie nazwą w PIERWSZYM wierszu, i liczba liczby wierszy w tabeli, więc w tym przypadku [Mark, 7]. count (), ponieważ funkcja agregująca działa na całym zestawie danych, sumując, licząc lub ograniczając określone pole do jednego wiersza. Grupuj według dzieli zestaw danych na części w oparciu o unikalne kombinacje określonych pól
Avatar_Squadron
3
Coś, z czym walczyłem, to eliminowanie wyników bez duplikatów. Nie można rzucać count(*) > 1w whereklauzuli bo to zagregowanej funkcji. Otrzymasz również bardzo nieprzydatny komunikat: „Nieprawidłowe użycie funkcji grupy”. Prawo sposobem jest alias hrabia name,COUNT(*) as cnti dodać HAVING tak: HAVING count > 1.
Patrick M
4
@PatrickM Tak, HAVINGdotyczy warunków, które należy zastosować po agregacji, natomiast WHEREdotyczy warunków, które należy zastosować przed nim. (Innym sposobem myślenia jest to, że WHEREdotyczy oryginalnych danych wiersza; HAVINGdotyczy wyjściowych danych wiersza.)
Amber
2
W dobrze skonstruowanej instrukcji SQL jest coś bardzo satysfakcjonującego.
Joshua Pinter
14

Co powiesz na coś takiego:

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

Wybierasz nazwę i liczbę wyświetleń, ale grupujesz według nazwy, więc każda nazwa jest wybierana tylko raz.

Na koniec sortuj według liczby malejących zamówień, aby na pierwszym miejscu byli najczęściej pojawiający się użytkownicy.

Pascal MARTIN
źródło
Twoje zapytanie pomogło mi. W rezultacie zwraca kilka wierszy. Chciałem również wiedzieć, jak znaleźć liczbę tego wyniku. Próbowałem kilka zapytań, ale wydaje się, że nie jest w stanie policzyć agregacji. Czy mógłbyś w tym pomóc?
Nav
@Nav - ile tego? Liczba zwróconych wierszy? To SELECT COUNT(DISTINCT name) as count FROM your_tableAby policzyć całkowitą liczbę wierszy tabeli, wykonaj zapytanie Pascala bez group byinstrukcji.
Jesień Leonard,
Co za różnica robi minuta!
Chuck Le Butt,
6

Właśnie zmieniłem COUNT (*) Amber na COUNT (1) dla lepszej wydajności.

SELECT name, COUNT(1) as count 
FROM tablename 
GROUP BY name 
ORDER BY count DESC;
Aerin
źródło
1
Właściwie to, co powiedziałeś, jest tu
James