SQL: ¿Cómo obtener el recuento de cada valor distinto en una columna?

176

Tengo una tabla SQL llamada "posts" que se ve así:

id | category
-----------------------
1  | 3
2  | 1
3  | 4
4  | 2
5  | 1
6  | 1
7  | 2

Cada número de categoría corresponde a una categoría. ¿Cómo haría para contar el número de veces que aparece cada categoría en una publicación, todo en una consulta SQL ?

Como ejemplo, dicha consulta podría devolver una matriz simbólica como esta: (1:3, 2:2, 3:1, 4:1)


Mi método actual es usar consultas para cada categoría posible, como: SELECT COUNT(*) AS num FROM posts WHERE category=#y luego combinar los valores de retorno en una matriz final. Sin embargo, estoy buscando una solución que use solo una consulta.

Jeff Gortmaker
fuente
3
Posible duplicado de MySQL: recuento de ocurrencias de valores distintos
Oleg V. Volkov

Respuestas:

311
SELECT
  category,
  COUNT(*) AS `num`
FROM
  posts
GROUP BY
  category
Dan Grossman
fuente
3
¡Gracias! ¡Era mucho más simple de lo que pensaba!
Jeff Gortmaker
44
@MichelAyres: fuente?
Moberg
55
"Es decir, el estándar ANSI reconoce que es evidente lo que quiere decir. COUNT (1) ha sido optimizado por los proveedores de RDBMS debido a esta superstición. De lo contrario, se evaluaría según ANSI" Count (*) vs Count (1)
Michel Ayres
@Moberg Así fue como aprendí (personas mayores enseñando supersticiones ...). Aquí hay una pequeña parte del chat para una discusión al respecto
Michel Ayres
1
Funciona "allí" cuando usa nombres de columnas y tablas que existen en el ejemplo.
Dan Grossman