Jose: /MySQL/PHP - Anzahl der Abfragen reduzieren

Beitrag lesen

Hallo,

ich arbeite gerade an einem Link-Directory für meine Homepage, so etwas in der Art von Yahoo, wo jeder
seine Lieblingslinks eintragen kann und alles dann in Haupt- und beliebig vielen Unterkategorien
organisiert ist. Jetzt möchte ich, dass neben jeder Kategorie die Anzahl der darin enthaltenen Unter- und
Unter-Unterkategorien etc. angezeigt wird. Dazu folgendes Beispiel:

Computer (4)
--------
Computer > Drucker
Computer > Drucker > HP
Computer > Drucker > Epson
Computer > Monitore

Befinde ich mich in der Hauptansicht, so soll nach obigem Beispiel für die Hauptkategorie Computer - 4 für
die darin enthaltenen Unterkategorien angezeigt werden. Befinde ich mich in der Kategorie Computer, soll
neben der Kategorie Drucker 2 angezeigt werden...

Mein Problem liegt nun darin, wie ich den Wert für die Unterkategorien möglichst effizient ermitteln kann.

Das Ganze basiert auf PHP/MySQL, es geht mir aber vor allem mal um einen theoretischen Ansatz. Ich habe
auch schon eine Lösung, die hat aber einen gravierenden Nachteil (dazu mehr weiter unten).

Meine Lösung:
Die Tabelle mit den Kategorien ist folgendermaßen aufgebaut catID, catParent, catName. Dabei ist catID der Primärschlüssel und catParent die id der darüberliegenden Kategorie.
Angenommen ich befinde mich in der Hauptansicht (cat=0), so könnte ich auf folgende Art und Weise die
Unterkategorien ermitteln:

  1. Hauptkategorien herausfinden - where catParent = 0 -> liefert z.B. catID 1, 2, 8 (d.h. ich hätte drei Hauptkategorien)
  2. Für jede dieser Hauptkategorien möchte ich nun die Anzahl der Unterkategorien - foreach
  3. where catParent = 1 -> liefert 9, 10, 11, 12
  4. where catParent IN (9, 10, 11, 12) -> liefert 0 Ergebnisse
    Ok, jetzt weiß ich, es gibt keine weiteren Unterkategorien und Kategorie 1 hat insges. 4 Unterkategorien.
  5. nächste Hauptkategorie ist 2 - next foreach
  6. where catParent = 2 -> liefert 3, 17, 18
  7. where catParent IN (3, 17, 18) -> liefert 4, 5
  8. where catParent IN (4, 5) -> liefert 7, 6
  9. where catParent IN (7, 6) -> liefert 0 Ergebnisse
  10. Ok, Kategorie 2 hat also insges. 7 Unterkategorien.
    ...

Das Problem dabei ist, dass ich so sehr schnell sehr viele Abfragen beisammen habe. Hier hatte 'Kategorie 1' 1 Unterkategorie und 'Kategorie 2' 3 Unterkategorien und ich benötigte schon 7 Abfragen für das Ergebnis. Bei 10 Hauptkategorien mit jeweils 5 Unterkategorien wären das 61 Abfragen. Das scheint mir dann doch etwas viel und dürfte wohl ziemlich auf die Performance schlagen, oder?

Meine Frage an Euch nun, kennt jemand eine bessere Methode, um dieses Problem zu lösen? Ich bin mit MySQL noch nicht wirklich sattelfest und könnte mir vorstellen, dass es da einen effizienteren Lösungsansatz gibt.

Ich freue mich über jede Anregung!

Jose

-----
Der Kopf ist rund, damit die Gedanken ihre Richtung ändern können.