[mysql] Unterkategorien zählen?

bartman336

Mitglied
Hi Leute,
ich häng hier mal wieder vor einem Problem und komme nicht wirklich weiter.
Es geht um folgendes, ich habe die Tabelle Kategorien mit folgendem Aufbau.

Code:
+---------+---------+---------+
| id      | name    | parent  |
+---------+---------+---------+
| 1       | menu1   | 0       |
| 2       | menu2   | 0       |
| 3       | sub1    | 1       |
| 4       | sub2    | 1       |
| 5       | sub3    | 2       |
+---------+---------+---------+

Und ich möchte jetzt gerne als Ergebnis eines Queries folgendes Ergebnis erhalten:

Code:
+---------+---------+---------+---------+
| id      | name    | parent  | anzahl  |
+---------+---------+---------+---------+
| 1       | menu1   | 0       |2        |
| 2       | menu2   | 0       |1        |
+---------+---------+---------+---------+

Aber leider sind meine SQL Kenntnisse nicht gerade die besten und deswegen scheitere ich schon an dieser (wahrscheinlich) doch sehr leichten Aufgabe.

Es wäre klasse wenn mir hier jemand helfen könnte oder mir zumindesten einen kleinen Denkanstoss geben wie das zu lösen sein könnte.
 
Denkanstoss:
Code:
SELECT s.id, s.name, s.parent, COUNT (p.parent) AS anzahl
FROM tabelle AS s
LEFT JOIN tabelle AS p ON (s.id = p.parent)
GROUP BY s.id
WHERE s.parent=0
Ich bin mir nicht sicher, ob COUNT auch null-Werte mitzählt, wegen Kategorien ohne Unterkategorien. Dann müsstest Du mit einer IF-Abfrage im Statement das noch abfangen. Also nach dem Motto if p.parent IS NULL dann 0 sonst Count....

Gruß hpvw
 
Erstmal Danke das hilft mir schon mal nen bischen weiter auch wenn der Query so noch mit nem Syntax Error quittiert.
Code:
SQL-Befehl:

SELECT s.id, s.name, s.parent, count( p.parent ) AS anzahl
FROM kategorien AS s
LEFT JOIN kategorien AS p ON ( s.id = p.parent )
GROUP BY s.id
WHERE s.parent =0
LIMIT 0 , 30

MySQL meldet:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(p.parent) AS anzahl
FROM kategorien AS s
LEFT JOIN kategorien AS p ON (s.id =' at line 1

Aber das krieg ich da auch noch irgendwie raus.
 
Zuletzt bearbeitet:
Ok habe den Fehler gefunden,
anstatt COUNT(p.parent) gehört dort COUNT(*) hin.

Code:
SELECT s.id, s.name, s.parent, COUNT(*) AS anzahl
FROM kategorien AS s
LEFT JOIN kategorien AS p ON (s.id = p.parent)
WHERE s.parent=0
GROUP BY s.id

nochmals dank an alle Helfer (auch an die die nicht zum Forum gehören ;)).
 
Das freut mich. Ich hatte mich nicht so recht getraut, das vorzuschlagen, daher meine Frage: Was wird ausgegeben, wenn eine Kategorie keine Unterkategorien hat?

Gruß hpvw
 
Hm ok da ist dann doch noch nen kleiner Fehler drin.
Kategorien mit keiner Unterkategorie werden mit 1 angezeigt, leider genauso wie die mit einer Unterkategorie. Das heißt es gibt keine Unterscheidungsmöglichkeit für Kategorien mit keiner oder genau einer Unterkategorie.

Das ist für meine Sache jetzt nicht so das Problem da es keine Kategorie ohne Unterkategorie geben wird, aber doof ist es trotzdem.

Aber mal gucken, das krieg ich bestimmt auch noch rausgefuchst. :)
 
Es geht bestimmt eleganter, aber Du könntest mal folgendes versuchen:
Code:
SELECT s.id, 
s.name, 
s.parent, 
IF(p.parent IS NULL,0,COUNT(*)) AS anzahl
FROM kategorien AS s
LEFT JOIN kategorien AS p ON (s.id = p.parent)
WHERE s.parent=0
GROUP BY s.id
 
Ok der letzte Query von dir funktionier jetzt genau wie er soll.

Code:
 Tabelle: kategorien
+---------+---------+---------+
| id      | name    | parent  |
+---------+---------+---------+
| 1       | menu1   | 0       |
| 2       | menu2   | 0       |
| 3       | menu3   | 0       |
| 4       | sub1.1  | 1       |
| 5       | sub1.2  | 1       |
| 6       | sub2.1  | 2       |
+---------+---------+---------+

Code:
Query:
SELECT s.id, 
s.name, 
s.parent, 
IF(p.parent IS NULL,0,COUNT(*)) AS anzahl
FROM kategorien AS s
LEFT JOIN kategorien AS p ON (s.id = p.parent)
WHERE s.parent=0
GROUP BY s.id

Code:
Ergebnis:
+---------+---------+---------+---------+
| id      | name    | parent  | anzahl  |
+---------+---------+---------+---------+
| 1       | menu1   | 0       |2        |
| 2       | menu2   | 0       |1        |
| 3       | menu3   | 0       |0        |
+---------+---------+---------+---------+
 
Was mir dazu noch einfällt, der vollständigkeit halber:
Die Spalte parent sollte als NOT NULL deklariert werden, wie es im MySQL-Referenzhandbuch unter 7.4.1.1 (JOIN-Syntax) angedeutet wird. So ist sichergestellt, dass das Feld nur NULL ist, wenn es keinen zur ON-Klausel passenden Eintrag (also keine Unterkategorie) gibt, da der LEFT JOIN bekannterweise alle Felder der zweiten Tabelle mit NULL füllt, wenn es keinen passenden Eintrag gibt.

Gruß hpvw
 

Neue Beiträge

Zurück