Zählen Sie das Auftreten von DISTINCT-Werten

218

Ich versuche, eine MySQL-Abfrage zu finden, die DISTINCT-Werte in einem bestimmten Feld findet, die Anzahl der Vorkommen dieses Werts zählt und dann die Ergebnisse nach der Anzahl sortiert.

Beispiel db

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

erwartetes Ergebnis

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

Antworten:

395
SELECT name,COUNT(*) as count 
FROM tablename 
GROUP BY name 
ORDER BY count DESC;
Bernstein
quelle
2
Was genau macht die Gruppe hier? Es ist nicht klar, was der Zweck ist? Es scheint, dass es ohne es funktionieren sollte, wenn Sie es nur klar lesen.
James
19
Während Bernsteins Frage die richtige Antwort auf die Frage ist, möchte ich ihren Kommentar korrigieren, um zu vermeiden, dass neue Leute in die Irre geführt werden. Wenn Sie die "Gruppierung nach" in einer MySQL-Abfrage weglassen, erhalten Sie nicht [Mike, 1], [Mike, 1], sondern ein einzelnes Ergebnis, das der Name in der ERSTEN zurückgegebenen Zeile ist, und eine Zählung der Anzahl der Zeilen in der Tabelle, also in diesem Fall [Mark, 7]. count () arbeitet als Aggregatfunktion mit dem gesamten Datensatz und summiert, zählt oder verkettet das angegebene Feld auf eine Zeile.
Gruppieren
3
Ich hatte Probleme damit, Ergebnisse ohne Duplikate zu eliminieren. Sie können ein count(*) > 1in eine whereKlausel nicht werfen , da es sich um aggregierte Funktionen handelt. Sie erhalten auch eine sehr wenig hilfreiche Meldung: "Ungültige Verwendung der Gruppenfunktion." Der richtige Weg ist, die Anzahl zu aliasen name,COUNT(*) as cntund eine Klausel wie folgt hinzuzufügen : HAVING count > 1.
Patrick M
4
@PatrickM Ja, HAVINGgilt für Bedingungen, die nach der Aggregation angewendet werden sollen, während dies WHEREfür Bedingungen gilt, die davor angewendet werden sollen. (Eine andere Denkweise ist, dass dies WHEREfür die ursprünglichen Zeilendaten HAVINGgilt ; gilt für die Ausgabezeilendaten.)
Amber
2
Eine gut konstruierte SQL-Anweisung hat etwas sehr Befriedigendes.
Joshua Pinter
14

Was ist mit so etwas:

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

Sie wählen den Namen und die Häufigkeit seiner Anzeige aus, gruppieren ihn jedoch nach Namen, sodass jeder Name nur einmal ausgewählt wird.

Schließlich bestellen Sie nach der Häufigkeit in absteigender Reihenfolge, damit die am häufigsten auftretenden Benutzer an erster Stelle stehen.

Pascal MARTIN
quelle
Ihre Anfrage hat mir geholfen. Infolgedessen werden einige Zeilen zurückgegeben. Ich wollte auch wissen, wie ich die Anzahl dieser Ergebnisse ermitteln kann. Ich habe ein paar Abfragen versucht, aber es scheint nicht in der Lage zu sein, ein Aggregat zu zählen. Könnten Sie dabei helfen?
Nav
@Nav - eine Zählung von was? Die Anzahl der zurückgegebenen Zeilen? Das ist SELECT COUNT(DISTINCT name) as count FROM your_tablefür eine Anzahl der gesamten Zeilen der Tabelle, tut Pascals Abfrage ohne die group byAussage.
Herbst Leonard
Was für einen Unterschied macht eine Minute!
Chuck Le Butt
6

Habe gerade Bernsteins COUNT (*) in COUNT (1) geändert, um eine bessere Leistung zu erzielen.

SELECT name, COUNT(1) as count 
FROM tablename 
GROUP BY name 
ORDER BY count DESC;
Aerin
quelle
1
Eigentlich , was du gesagt hast ist teilweise hier
James