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

Odpowiedzi:


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

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.


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;

1
Właściwie to, co powiedziałeś, jest tu
James
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.