Rolf B: verschiedene Kategorien in einer SELECT Abfrage zählen (addieren)

Beitrag lesen

Hallo Felix,

okay - das hatte ich nicht bedacht. Was ist, wenn in der Kategorientabelle eine Kategorie steht, die in der Datentabelle keine Einträge hat.

Das ist jetzt der alte Streit Subselect vs Join, den ich gerne schüren möchte 😉. Deine Query führt einen COUNT pro Kategorie durch, d.h. bei 100 Kategorien 100 COUNTs.

Man müsste es im real live mit großen Tabellen messen, aber eigentlich sollte für solche Aufgaben der LEFT JOIN optimiert sein. Ich gehe jetzt von einem Modell aus, wo Kategorien- und Datentabelle eine id-Spalte haben und in den Daten die kat_id als Fremdschlüssel steht.

Für die Gruppierung reicht eigentlich die id-Spalte der Kategorien-Tabelle aus. Aber formal muss eine nicht aggregierte Spalte, die im SELECT auszugeben ist, im Group By gelistet sein. Und wer weiß, ob der Name eindeutig ist...

SELECT kategorien.id as KatId,
       kategorien.name as Kategorie,
       COUNT(daten.id) as Anzahl
FROM kategorien LEFT JOIN daten
                ON kategorien.id = daten.kat_id
GROUP BY kategorien.id, kategorien.kat

Der Left Join erzeugt für Kategorien, die keine Daten haben, NULL-Werte für die Spalten der Datentabelle. Und COUNT(feldname) zählt Rows, wo das angegebene Feld null ist, nicht mit. Da die id der Daten in der DB sicherlich nie null ist, kann man auf diese Weise für unbelegte Kategorien eine 0 bekommen.

Beide Queries, mit Subselect oder mit Left Join, setzen voraus dass die Datentabelle einen Index hat, in dem die Kategorie-ID die erste Spalte ist. Andernfalls wird es bei größeren Datenmengen sehr langsam.

Rolf

--
sumpsi - posui - obstruxi