SQL: Como obter a contagem de cada valor distinto em uma coluna?

175

Eu tenho uma tabela SQL chamada "posts" que se parece com isso:

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

Cada número de categoria corresponde a uma categoria. Como eu contaria o número de vezes que cada categoria aparece em uma postagem, tudo em uma consulta sql ?

Como exemplo, essa consulta pode retornar uma matriz simbólica como esta: (1:3, 2:2, 3:1, 4:1)


Meu método atual é usar consultas para cada categoria possível, como: SELECT COUNT(*) AS num FROM posts WHERE category=#e combinar os valores de retorno em uma matriz final. No entanto, estou procurando uma solução que use apenas uma consulta.

Jeff Gortmaker
fonte
3
Possível duplicado do MySQL: ocorrências contagem de valores distintos
Oleg V. Volkov

Respostas:

310
SELECT
  category,
  COUNT(*) AS `num`
FROM
  posts
GROUP BY
  category
Dan Grossman
fonte
3
Obrigado! Era muito mais simples do que eu pensava!
Jeff Gortmaker
4
@MichelAyres: source?
Moberg
5
"Ou seja, o padrão ANSI reconhece como óbvio o que você quer dizer. COUNT (1) foi otimizado pelos fornecedores de RDBMS por causa dessa superstição. Caso contrário, seria avaliado conforme ANSI" Count (*) vs Count (1)
Michel Ayres
@Moberg Foi assim que aprendi (idosos ensinando superstições ...). Aqui está uma pequena parte do bate-papo para uma discussão sobre o assunto
Michel Ayres
1
Ele funciona "lá" quando você usa nomes de colunas e tabelas que existem no exemplo.
Dan Grossman