Kategorie ist Unterkategorie von Kategorie, usw.

muhkuh

Erfahrenes Mitglied
So, ich leg gleich mal los ;)
Ich will Kategorien als Unterkategorie einer anderen Kategorie definieren. Dazu hab ich eine extra Spalte in der Tabelle der Kategorien namens "kategorie".
Hat diese Spalte den Wert "none" gilt diese Kategorie als Hauptkategorie, andernfalls hat diese Spalte den Wert der ID der jeweiligen Unterkategorie.

Da ich nun aber evtl auch eine Unterkategorie einer Kategorie zuordnen will, die selber schon eine Unterkategorie ist, bekomme ich ein Probleme bei z.B. der Zählung der Beiträge einer Hauptkategorie, die selber Beiträge hat, aber auch mehrere Unterkategorien mit noch mehr Beiträgen, diese haben wiederum auch noch Unterkategorien mit Beiträgen.

Da ich aber nun nur bis zur jeweils einer Ebene drüberliegenden Kategorie weiss, welcher Oberkategorie diese angehört, die aber wiederrum auch einer Oberkategorie angehören kann, ergeben sich schnell Probleme bei den Abfragen, da ich, wenn ich mehr als zwei Ebenen haben will, jedesmal eine neue Datenbankabfrage starten muss, die ich coden muss.

Etwas anders dargestellt:
PHP:
    $sql_ebene0 = mysql_query("SELECT ID,name,kategorie FROM die_kategorien WHERE kategorie = "none"",$conn);
  while ($kateebene0 = mysql_fetch_assoc($sql_ebene0)) {
     echo $katebene0["name"];
        $sql_ebene1 = mysql_query("SELECT ID,name,kategorie FROM die_kategorien WHERE kategorie = '".$katebene0["kategorie"]."'",$conn);
            while ($kateebene1 = mysql_fetch_assoc($sql_ebene0)) {
                echo $katebene1["name"];
                    $sql_ebene2 = mysql_query(....

                         usw usw

   }
}

Ich könnte ja aber auch eine bestimmte Tiefe an Ebenen auf meinetwegen 5 festlegen und müsste dann jedesmal das ding eben bis auf eine Ebenentiefe von 5 Abfragen von Hand schreiben.

Nun zu der Frage ob das nicht vielleicht besser geht. Vielleicht will ich ja dann mal mehr als nur 5 Unterkategorien erstellen. Ich hab zwar jetzt kein Beispiel aber kann ja mal vorkommen, dass dieser Fall eintrifft ;)

Eigentlich gehts mir bei der ganzen Sache nur um die Darstellung in nem Select, indem ich die Unterkategorien eingerückt unter deren Oberkategorien aufzähle:)

Zur besseren Erlärung vielleicht das angehängte Bild. Die Farben der Selects haben nichts mit der Stufe der Kategorie zu tun, dienen lediglich der Verdeutlichung, welchen Status die jeweiligen Kategorien haben (Grün = Aktiv, Rot = Inaktiv :))

Ich hoffe, ich hab das ganze relativ klar dargestellt und freue mich auf Tipps :)
 

Anhänge

  • katunterkat.gif
    katunterkat.gif
    5,8 KB · Aufrufe: 149
Du könntest eine rekursive Funktion schreiben, die sich selbst aufruft, sobald eine Kategorie eine Untergategorie zugeordnet bekommen hat. Hier bräuchtest Du nur die Funktion einmal zu deklarieren, die Ebenen werden dann alle ausgelesen.

Kategorien und Unterkategorien (und Unter-Unterkategorien, etc.) sind ja vergleichbar mit einem Verzeichnisbaum.

Rekursion kann aber je nach Verzeichnistiefe sehr an der Performanz zehren. Hier dürften Nested Sets sehr interessant sein.

Also sind die Begriffe REKURSION oder NESTED SETS warscheinilch Deine Problemlösung ;-)

Nested Set Information
 
hmm ... momentan ist die Content*Builder Seite down. Der Server ist momentan etwas überlastet.

Die in dem anderen Thread angesprochene Klasse kannst du auch aus dem C*B Projekt selber beziehen. Es liegt da im Verzeichnis cb/lib/CB_NestedSet.class.php.

Die aktuelle Version von C*B kann von der aktuellen PHP Magazin CD bezogen werden.

Ciao, Jörg
 
Boah, erstmal ein dickes Dankeschön für die schnellen Antworten. Hab mir das meiste mal durchgelesen und jetzt hab ich Kopfweh :/

Aber ich denke ich stell das ganze um und lass das mit den Kategorien in meinem momentanen Projekt. Der Aufwand, den ich damit hätte (hab ehrlichgesagt nur die Hälfte des erklärten verstanden) lohnt sich hier nicht.

Weiterverfolgen werde ich das aber trotzdem, vielleicht kapier sogar ich das ja irgendwann mal :)

Trotzdem noch mal ein Dankeschön ;)
 
Mhh jetzt ist von meiner Seite aus die Frage wie oft sich diese Kategorien denn verändern? Ein anderer, wenn auch sehr unschöner Lösungsansatz wie ich finde, ist, einfach zu jeder Kategorie noch eine Spalte in der Datenbank anzulegen mit der Anzahl der enthaltenen Einträge innerhalb der Kategorie und aller Unterkategorien. Dann wäre zwar bei der Änderung einer Kategorie eine recht hohe Serverauslastung, aber dafür nicht bei jedem sonstigen Seitenaufruf weil du den Wert jeweils direkt aus der Datenbank auslesen kannst. Du musst dich nur noch darum kümmern, dass der Wert bei einer Änderung von der aktuellen Kategorie rekursiv bis nach oben aktualisiert.
 
jo, kla

was ich mir aber auch schon überlegt habe, ist eben auch eine extra Spalte in der Tabelle der Kategorien, die die Anzahl der vorhandenen Unterkategorien angibt.

So kann ich diese Spalte auslesen und dann ne Abfrage-Schleife durchlaufen lassen. Das wäre in der Realisierung für mich jetzt das einfachste, wobei das halt von der Serverauslastung bei vielen Kategorien total be*******en ist (tschuldigung).
 
Zurück