SQL: Wie kann die Anzahl der einzelnen Werte in einer Spalte ermittelt werden?

175

Ich habe eine SQL-Tabelle namens "posts", die so aussieht:

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

Jede Kategorienummer entspricht einer Kategorie. Wie würde ich vorgehen , um zu zählen, wie oft jede Kategorie in einem Beitrag in einer SQL-Abfrage angezeigt wird ?

Eine solche Abfrage kann beispielsweise ein symbolisches Array wie das folgende zurückgeben: (1:3, 2:2, 3:1, 4:1)


Meine derzeitige Methode besteht darin, Abfragen für jede mögliche Kategorie zu verwenden, z. B.: SELECT COUNT(*) AS num FROM posts WHERE category=#, und dann die Rückgabewerte zu einem endgültigen Array zu kombinieren. Ich suche jedoch nach einer Lösung, die nur eine Abfrage verwendet.

Jeff Gortmaker
quelle
3
Mögliches Duplikat von MySQL: Zählen Sie Vorkommen unterschiedlicher Werte
Oleg V. Volkov

Antworten:

309
SELECT
  category,
  COUNT(*) AS `num`
FROM
  posts
GROUP BY
  category
Dan Grossman
quelle
3
Vielen Dank! Es war viel einfacher als ich dachte!
Jeff Gortmaker
4
@ MichaelAyres: Quelle?
Moberg
5
"Das heißt, der ANSI-Standard erkennt, dass es offensichtlich blutet, was Sie meinen. COUNT (1) wurde von RDBMS-Anbietern aufgrund dieses Aberglaubens optimiert. Andernfalls würde es gemäß ANSI" Count (*) vs Count (1)
Michel Ayres
@Moberg So habe ich gelernt (alte Leute unterrichten Aberglauben ...). Hier ist ein kleiner Teil des Chats für eine Diskussion darüber
Michel Ayres
1
Es funktioniert "dort", wenn Sie Spalten- und Tabellennamen verwenden, die im Beispiel vorhanden sind.
Dan Grossman