Moin!
Der Inhalt einer SELECT-Box ist eine lineare Liste, kein Baum.
Definiere also Übersetzungsregeln, die dir die Baumstruktur in eine lineare Abfolge umsetzen.
Ich dachte daran, einfach ein oder zwei vor einer Unterkategorie zu setzen, damit optisch eine Baumstruktur entsteht.
Der Trick wäre, deiner Tabelle dann einfach zwei weitere Informationen hinzuzufügen: 1. ein Sortierkriterium, welches die Ausgabe deiner Tabelle passend für dein SELECT sortiert, und 2. eine Tiefenangabe, das dir angibt, auf welcher Baumebene der jeweilige Eintrag aufzufinden ist.
Es ist bei rekursiven Problemen immer ratsam, die Datenbank genau einmal zu befragen, und dann im Speicher die rekursive Struktur herzustellen.
Genau darum geht es mir. Wie soll ich das machen? Alle meine bisherigen Lösungsansätze verliefen im Sand.
Die Sache ist doch recht simpel: Du fragst einfach die gesamte Tabelle auf einmal ab. Dann gehst du das Ergebnis durch und suchst alle Elternknoten raus. Die packst du in deine Baumstruktur und löschst sie in deiner Tabelle (spart Suchzeit). Dann suchst du im Datenbankergebnis alle Knoten, die einem der schon gefundenen Elternknoten zugeordnet sind, fügst sie dort in den Baum ein, und entfernst sie ebenfalls aus der Ergebnistabelle.
Und das machst du so lange, bis du zu jedem existierenden Knoten deines Baumes keinen Kinderknoten mehr in der Ergebnistabelle findest (und hoffentlich ist die Ergebnistabelle dann leer - ansonsten ist deine Baumstruktur fehlerhaft).
Wie gesagt: Mit Hilfsinformationen, wie oben genannt, würdest du dir das gesamte Baumbauen ersparen können, weil du einfach mit dem Sortieren (ORDER BY) nach dem Kriterium die richtige Reihenfolge für dein SELECT garantieren kannst, und mit der Tiefeninformation weißt du, wieviele Stufen du den Eintrag einzurücken hast.
- Deshalb scheint es mir nicht falsch, die rekursive Struktur eventuell komplett zu linearisieren, um damit die beständigen Umsetzungsprobleme zu eliminieren...
Auf die MySQL-Tabelle habe ich keinen Einfluss, darf ich auch nicht haben, da noch andere Dateien darauf zugreifen.
Das ist dann schlecht für dich - aber wenn andere Skripte auch diese rekursive Struktur auslesen, kannst du doch bei denen mal nachgucken, wie dort Listen oder Zugriffe allgemein realisiert werden.
Absolut nicht empfehlenswert ist jedenfalls, nacheinander in mehreren Abfragen jeweils nur die Startknoten und dann je gefundenem Knoten die zugehörigen Kinderknoten zu ermitteln. Damit legst du die Datenbank garantiert lahm. Deshalb mußt du diese Arbeit eben selbst erledigen - das ist im Speicher aber auch wesentlich rascher getan, als mit der Datenbankabfrage.
- Sven Rautenberg
My sssignature, my preciousssss!