SQL: Comment obtenir le décompte de chaque valeur distincte dans une colonne?

176

J'ai une table SQL appelée "posts" qui ressemble à ceci:

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

Chaque numéro de catégorie correspond à une catégorie. Comment pourrais-je compter le nombre de fois que chaque catégorie apparaît sur un message dans une seule requête SQL ?

À titre d'exemple, une telle requête peut renvoyer un tableau symbolique tel que celui-ci: (1:3, 2:2, 3:1, 4:1)


Ma méthode actuelle consiste à utiliser des requêtes pour chaque catégorie possible, telle que SELECT COUNT(*) AS num FROM posts WHERE category=#:, puis à combiner les valeurs de retour dans un tableau final. Cependant, je recherche une solution qui n'utilise qu'une seule requête.

Jeff Gortmaker
la source
3
Double possible de MySQL: compter les occurrences de valeurs distinctes
Oleg V. Volkov

Réponses:

311
SELECT
  category,
  COUNT(*) AS `num`
FROM
  posts
GROUP BY
  category
Dan Grossman
la source
3
Merci! C'était beaucoup plus simple que je ne le pensais!
Jeff Gortmaker
4
@MichelAyres: source?
Moberg
5
"Autrement dit, la norme ANSI reconnaît ce que vous voulez dire comme une évidence. COUNT (1) a été optimisé par les fournisseurs de SGBDR en raison de cette superstition. Sinon, il serait évalué selon ANSI" Count (*) vs Count (1)
Michel Ayres
@Moberg C'est comme ça que j'ai appris (des personnes âgées enseignant des superstitions ...). Voici une petite partie du chat pour en discuter
Michel Ayres
1
Cela fonctionne «là» lorsque vous utilisez des noms de colonne et de table qui existent dans l'exemple.
Dan Grossman