Compter les occurrences des valeurs DISTINCT


218

J'essaie de trouver une requête MySQL qui trouvera des valeurs DISTINCT dans un champ particulier, compte le nombre d'occurrences de cette valeur, puis ordonne les résultats par le nombre.

exemple db

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

résultat attendu

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

Réponses:


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

2
Que fait exactement le groupe ici? On ne sait pas quel est le but? Il semble que cela devrait fonctionner si vous le lisez simplement.
James

19
Bien que la requête d'Amber soit la bonne réponse à la question, je voudrais apporter une correction à son commentaire pour éviter d'induire de nouvelles personnes en erreur. Si vous laissez "group by" dans une requête MySQL, vous n'obtenez pas [Mike, 1], [Mike, 1], vous obtenez un seul résultat qui sera le nom sur la PREMIÈRE ligne retournée, et un nombre du nombre de lignes dans le tableau, donc dans ce cas [Mark, 7]. count (), car une fonction d'agrégation fonctionne sur l'ensemble des données, en additionnant, comptant ou concatant le champ spécifié sur une seule ligne. Grouper par subdivise l'ensemble de données en morceaux basés sur des combinaisons uniques des champs spécifiés
Avatar_Squadron

3
J'ai eu du mal à éliminer les résultats sans doublons. Vous ne pouvez pas jeter un count(*) > 1dans une whereclause car c'est une fonction d'agrégation. Vous obtenez également un message très inutile: «Utilisation non valide de la fonction de groupe». La bonne manière est d'alias le compte name,COUNT(*) as cntet ajouter une clause ayant comme ceci: HAVING count > 1.
Patrick M

4
@PatrickM Oui, HAVINGpour les conditions qui doivent être appliquées après l'agrégation, alors que WHEREpour les conditions qui doivent être appliquées avant. (Une autre façon de penser est celle qui WHEREs'applique aux données de ligne d'origine; HAVINGs'applique aux données de ligne de sortie.)
Amber

2
Il y a quelque chose de très satisfaisant dans une instruction SQL bien construite.
Joshua Pinter

14

Et quelque chose comme ça:

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

Vous sélectionnez le nom et le nombre de fois qu'il apparaît, mais en le regroupant par nom, chaque nom n'est sélectionné qu'une seule fois.

Enfin, vous commandez par le nombre de fois dans l'ordre décroissant, pour que les utilisateurs les plus fréquents viennent en premier.


Votre requête m'a aidé. Il renvoie en conséquence quelques lignes. Je voulais aussi savoir comment dénombrer ce résultat. J'ai essayé quelques requêtes, mais il ne semble pas pouvoir faire un compte sur un agrégat. Pourriez-vous m'aider?
Nav

@Nav - un compte de quoi? Le nombre de lignes retournées? C'est SELECT COUNT(DISTINCT name) as count FROM your_tablePour un décompte du nombre total de lignes de la table, faites la requête de Pascal sans l' group byinstruction.
Automne Leonard

Quelle différence une minute fait!
Chuck Le Butt

6

Nous venons de changer COUNT (*) d'Amber en COUNT (1) pour de meilleures performances.

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

1
En fait, ce que vous avez dit est partiel ici
James
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.