Thomas: "Verschachtelte" Einträge ausgeben

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

  1. 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

    1. 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

      1. 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