Kai: TreeView in Datenbank mit PHP abfragen?

Guten Morgen,

ich stehe vor folgenden Problem und hoffe das Ihr mir helfen könnt. Ich möchte ein TreeView in einer Datenbank anlegen und mit PHP dann geordnet angezeigt lassen. In der Datenbank speicher ich dazu immer den übergeordnetten Ordner. Aber ich bin mir noch nicht schlüssig wie ich die rekursive Abfrage gestalten kann.

In der DB sieht es momentan so aus:

OrdnerID | UeberOrdnerID | Name
----------------------------------------
1        | 0             | Hauptordner
2        | 1             | Unterordner 1
3        | 2             | Unterordner 1.1
4        | 1             | Unterordner 2
5        | 1             | Unterordner 3
6        | 5             | Unterordner 3.1
7        | 6             | Unterordner 3.1.1
8        | 5             | Unterordner 3.2

Aussehen soll das dann nach der PHP Abfrage später so

  • Hauptordner
      + Unterordner 1
        + Unterordner 1.1
      + Unterordner 2
      + Unterordner 3
        + Unterordner 3.1
          + Unterordner 3.1.1
        + Unterordner 3.2

Ich hoffe Ihr könnt mir helfen,

Gruß,
Kai

  1. yo,

    erst mal ein hinweis, rekursionen sind böse und sollten nach möglichkeit vermieden werden. ;-)

    aber machmal will man halt böse sein....

    Aber ich bin mir noch nicht schlüssig wie ich die rekursive Abfrage gestalten kann.

    mit self-joins oder aber du bringst eine sortierung in die tabelle rein. und wenn ich mir die spalten anschaue, dann kann man doch schon anhand des namens sortieren und muss nur noch eine spalte einführen, welche die "tiefe" angibt ?

    Ilja

  2. Hi,

    wie Ilja schon meinte .. (datenbankseitige) Rekursionen sind nicht immer gut.

    mögliche Alternativen wären:

    • Nested Sets
    • rekursive Verarbeitung in PHP via Arrays oder geeigneteren Objekten
    • XML Dokument

    Ciao und tschüss,
    Frank

  3. Das Problem hatte ich auch mal, nur war es bei mir auch noch problematischer, weil ich nicht von Anfang an wusste, wie "tief" die Verschachtelung geht.

    Deshalb hab ich eine Art IP-Adressen-System eingeführt.

    OrdnerID | IPClass | Name
    ----------------------------------------
    1        | 0             | Hauptordner
    2        | 1             | Unterordner 1.2
    3        | 1.2           | Unterordner 1.2.3
    4        | 2             | Unterordner 2
    5        | 2             | Unterordner 2
    6        | 5             | Unterordner 5.6
    7        | 5.6           | Unterordner 5.6.7
    8        | 5.6           | Unterordner 5.6.8

    Wenn ich dann nun einen Select mit Order by Ipclass mache, kommt es mir genau so sortier raus, wie ich es gerne haben möchte (in der DB ist es eben nicht so schön drin, wie im Beispiel).
    Ich prüfe dann immer ab, wieviel Klassen vorhanden sind und rücke dementsprechend ein.

    Vielleicht hilft Dir das ja weiter.

    lg, Jan