2009-08-28 19 views
159

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

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 

Gracias

Respuesta

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

¿Qué hace exactamente el grupo aquí? No está claro qué es el propósito? Parece que debería funcionar sin él si simplemente lo lees con claridad. – Prospero

+16

Si bien la consulta de Amber es la respuesta correcta para la pregunta, me gustaría hacer una corrección en su comentario para evitar extraviar a las personas nuevas. Si deja el "grupo por" en una consulta de MySQL, no obtiene [Mike, 1], [Mike, 1], obtiene un único resultado que será el nombre en la PRIMERA fila devuelta, y un recuento de número de filas en la tabla, por lo que en este caso [Mark, 7]. count(), como una función de agregado funciona en todo el conjunto de datos, sumando, contando o combinando el campo especificado hasta una fila. Agrupar subdivide el conjunto de datos en fragmentos en función de combinaciones únicas de los campos especificados –

+0

@Avatar_Squadron Muy bien; He eliminado el comentario anterior, estaba fuera de mi cabeza, y no tiendo a observar realmente los resultados del conteo sin grupo por mucho. :) – Amber

9

¿qué pasa con algo como esto:

select name, count(*) as num 
from your_table 
group by name 
order by count(*) desc 

es decir, está seleccionando el nombre y la cantidad de veces que aparece; pero agrupando por nombre para que cada nombre sea seleccionado solo una vez.

Luego, usted ordena por número de veces, desc; tener los usuarios que aparecen con mayor frecuencia son lo primero.

+0

Su 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 parece que no se puede contar un agregado. ¿Podrías ayudarme con eso? – Nav

+0

@Nav - ¿un recuento de qué? ¿El número de filas devuelto? Eso es 'SELECT COUNT (nombre DISTINCT) como count FROM your_table' Para contar las filas totales de la tabla, realice la consulta de Pascal sin la instrucción' group by'. –

+0

¡Qué diferencia hace un minuto! –

0

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

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