Cuente las ocurrencias de los valores DISTINCT

218

Estoy tratando de encontrar una consulta MySQL que encuentre valores DISTINCT en un campo en particular, cuente el número de ocurrencias de ese valor y luego ordene los resultados por conteo.

ejemplo db

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

Resultado Esperado

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

Respuestas:

396
SELECT name,COUNT(*) as count 
FROM tablename 
GROUP BY name 
ORDER BY count DESC;
Ámbar
fuente
2
¿Qué es exactamente el grupo haciendo aquí? No está claro cuál es el propósito? Parece que debería funcionar sin él si solo lo lees con claridad.
James
19
Si bien la consulta de Amber es la respuesta correcta a la pregunta, me gustaría corregir su comentario para evitar desviar a las personas nuevas. Si dejas el "grupo por" en una consulta MySQL, no obtienes [Mike, 1], [Mike, 1], obtienes un solo resultado que será el nombre en la PRIMERA fila devuelta, y un conteo de número de filas en la tabla, así que en este caso [Mark, 7]. count (), ya que una función agregada funciona en todo el conjunto de datos, sumando, contando o concatenando el campo especificado en una fila. Agrupe por subdivide el conjunto de datos en fragmentos basados ​​en combos únicos de los campos especificados
Avatar_Squadron
3
Algo con lo que luché fue eliminar resultados sin duplicados. No se puede tirar una count(*) > 1en una wherecláusula porque es un funciones de agregado. También recibe un mensaje muy poco útil: "Uso no válido de la función de grupo". La forma correcta es alias de la cuenta name,COUNT(*) as cnty añadir una cláusula having de este modo: HAVING count > 1.
Patrick M
44
@PatrickM Sí, HAVINGes para condiciones que deben aplicarse después de la agregación, mientras que WHEREes para condiciones que deben aplicarse antes. (Otra forma de pensar en esto es que se WHEREaplica a los datos de la fila original; se HAVINGaplica a los datos de la fila de salida.)
Ámbar
2
Hay algo muy satisfactorio en una declaración SQL bien construida.
Joshua Pinter
14

¿Qué pasa con algo como esto?

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

Está seleccionando el nombre y la cantidad de veces que aparece, pero agrupando por nombre para que cada nombre se seleccione solo una vez.

Finalmente, ordena por la cantidad de veces en orden DESCending, para que los usuarios que aparecen con más frecuencia sean lo primero.

Pascal MARTIN
fuente
Tu consulta me ayudó. Devuelve algunas filas como resultado. También quería saber cómo encontrar el recuento de este resultado. Intenté algunas consultas, pero no parece ser capaz de contar en un agregado. ¿Podrías ayudar con eso?
Nav
@Nav: ¿un recuento de qué? ¿El número de filas devueltas? Eso es SELECT COUNT(DISTINCT name) as count FROM your_tablePara un recuento de las filas totales de la tabla, haga la consulta de Pascal sin la group bydeclaración.
Otoño Leonard
¡Qué diferencia hace un minuto!
Chuck Le Butt
6

Acabo de cambiar el COUNT de Amber (*) a COUNT (1) para un mejor rendimiento.

SELECT name, COUNT(1) as count 
FROM tablename 
GROUP BY name 
ORDER BY count DESC;
Aerin
fuente
1
En realidad, lo que dijiste es parcial aquí
James