Contare le occorrenze dei valori DISTINCT


218

Sto cercando di trovare una query MySQL che troverà i valori DISTINCT in un determinato campo, contare il numero di occorrenze di quel valore e quindi ordinare i risultati in base al conteggio.

esempio db

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

Risultato atteso

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

Risposte:


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

2
Cosa sta facendo esattamente il gruppo qui? Non è chiaro che cos'è lo scopo? Sembra che dovrebbe funzionare senza che tu lo leggessi chiaramente.
James,

19
Mentre la domanda di Amber è la risposta corretta alla domanda, vorrei apportare una correzione al suo commento per evitare di smarrire nuove persone. Se si interrompe il "gruppo per" in una query MySQL, non si ottiene [Mike, 1], [Mike, 1], si ottiene un singolo risultato che sarà il nome sulla PRIMA riga restituita e un conteggio del numero di righe nella tabella, quindi in questo caso [Mark, 7]. count (), poiché una funzione aggregata funziona sull'intero set di dati, sommando, contando o concedendo il campo specificato fino a una riga. Raggruppa per suddivisione del set di dati in blocchi basati su combinazioni uniche dei campi specificati
Avatar_Squadron

3
Qualcosa con cui ho lottato è stato eliminare i risultati senza duplicati. Non è possibile inserire a count(*) > 1in una whereclausola perché è una funzione aggregata. Viene inoltre visualizzato un messaggio molto inutile: "Utilizzo non valido della funzione di gruppo". Il modo giusto è quello di alias il conteggio name,COUNT(*) as cnte aggiungere una clausola having in questo modo: HAVING count > 1.
Patrick M,

4
@PatrickM Sì, HAVINGè per le condizioni che dovrebbero essere applicate dopo l'aggregazione, mentre WHEREper le condizioni che dovrebbero essere applicate prima di esso. (Un altro modo di pensare a questo è che si WHEREapplica ai dati della riga originale; si HAVINGapplica ai dati della riga di output.)
Ambra

2
C'è qualcosa di molto soddisfacente in un'istruzione SQL ben costruita.
Joshua Pinter,

14

Che dire di qualcosa del genere:

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

Stai selezionando il nome e il numero di volte che appare, ma raggruppando per nome in modo che ciascun nome sia selezionato una sola volta.

Infine, ordinate per il numero di volte in ordine DISCending, per avere prima gli utenti che appaiono più frequentemente.


La tua domanda mi ha aiutato. Di conseguenza restituisce alcune righe. Volevo anche sapere come trovare il conteggio di questo risultato. Ho provato qualche domanda ma non sembra poter contare su un aggregato. Potresti aiutarci?
Nav

@Nav - un conteggio di cosa? Il numero di righe restituite? Questo è SELECT COUNT(DISTINCT name) as count FROM your_tableper un conteggio delle righe totali della tabella, esegui la query di Pascal senza l' group byistruzione.
Autunno Leonard,

Che differenza fa un minuto!
Chuck Le Butt,

6

Ho appena cambiato COUNT (*) di Amber in COUNT (1) per prestazioni migliori.

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

1
In realtà quello che hai detto è parziale qui
James
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.