"Verschachtelte" Einträge ausgeben
Thomas
- php
Hallo Leute!
Ich habe folgende Datenbankstruktur:
id, subid, titel,.... (relevant sind hier nur die ersten 3).
Wenn ich einen neuen Eintrag mache, kann ich angeben, welchem vorigen Eintrag es zugeordnet werden soll.
Somit hab ich zB folgende Daten drinnen:
ID SUBID NAME
1 0 eins
2 1 zwei
3 1 drei
4 3 vier
5 0 fuenf
6 0 sechs
7 6 sieben
8 7 acht
9 8 neun
Die Ausgabe sollte folgendermassen strukturiert sein:
eins
- zwei
- drei
-- vier
fuenf
sechs
- sieben
- acht
- neun
Nur, wie sieht hier das SQL aus? Oder wie kann ich das sonst über PHP ausgeben?
lg, Thomas
Halihallo Thomas
Nur, wie sieht hier das SQL aus? Oder wie kann ich das sonst über PHP ausgeben?
Welche DBMS? - Einige unterstützen Rekursion, andere nicht. MySQL
z.B. nicht, da muss man die Rekursion über PHP regeln.
Viele Grüsse
Philipp
Hallo Philipp!
Welche DBMS? - Einige unterstützen Rekursion, andere nicht. MySQL
z.B. nicht, da muss man die Rekursion über PHP regeln.
Es handelt sich dabei um MySQL, leider. Hatte mir da eh schon was ausgedacht.
Und zwar hab ich einen Sort-Parameter, ich kann also alle Felder sortieren.
Dann reihe ich die Felder so wie ich sie haben möchte, und bei der Ausgabe prüfe ich ab ob die Subid mit der Id der vorigen Dateinreihe übereinstimmt.
Hättest Du da viellicht noch eine bessere bzw. günstigere Lösung?
lg, Thomas
Halihallo Thomas
Dann reihe ich die Felder so wie ich sie haben möchte, und bei der Ausgabe prüfe ich ab ob die Subid mit der Id der vorigen Dateinreihe übereinstimmt.
Das wird so nicht funktionieren [1]. Du musst die SubID mit *jeder*
vorangegangenen ID vergleichen und den Datensatz als "Child" also
Unterknoten dort einfügen, wo die SubID=ID ist.
Zudem ist die Namengebung von SubID etwas entfremdend. SuperID oder
ParentID wäre etwas "treffender" gewählt, IMHO zumindest.
Hättest Du da viellicht noch eine bessere bzw. günstigere Lösung?
Das ist stark davon abhängig, wie du die Daten nachher vorliegen
haben möchtest. Geht es darum eine Art Verschachtelte-HTML-Table-
Struktur einfach an den Browser auszugeben, oder diese
Verschachtelung in einem Array vorliegen zu haben?
Die einfachste und intuitivste Methode ist die Rekursion.
function rekursion(ParentID) {
// selektiere alle Knoten, die ParentID als <ParentID> haben.
// falls keine selektiert wurden, return "fertig"
foreach (Knoten in Ergebnis der vorherigen Abfrage) {
rekursion(<ID-Des-Knotens>) // das wird der neue Parent für den
// nächsten Rekursionsschritt
}
}
Eine Ausgabe als HTML-Table oder <ul>-Liste ist so wirklich leicht
umzusetzen.
Was willst du machen?
[1] Du gehst von der Annahme aus, dass alle Daten schön der Reihe
nach in der DB abgelegt sind (die Reihenfolge ist *nicht* umbedingt
über die ID rekonstruierbar; stell dir vor, dass du nach neun
plötzlich eine 3.5 als Unterknoten von "zwei" machen möchtest) und
dass es keine Schritte "nach oben innerhalb der Hierarchie" gibt.
Viele Grüsse
Philipp