Horst Reinelt: TreeView aus DB-Daten

Hallo Forumler!

Ich habe eine knifflige Aufgabe für alle Programmier-Freaks unter euch.
In einer SQL-DB liegen wie folgt Daten (sortiert nach id):

tabelle1
+-------+-------+
|   id  | parent|
+-------+-------+
|   1   |   5   |
|   2   |   8   |
|   3   |   1   |
|   4   |   8   |
|   5   |   0   |
|   6   |   8   |
|   7   |   2   |
|   8   |   5   |
|   9   |   2   |
|  10   |   1   |
+-------+-------+

Die rechte Spalte zeigt jeweils eine id als Elternobjekt, wobei '0' der Ursprung ist.
Das heißt z. B., 1 und 8 sind Kinder von 5.
Oder z. B. 2, 4 und 6 sind Kinder von 8.

Die Daten sollten jetzt mit Perl so umstrukturiert werden, dass das Ergebnis wie folgt lautet:

tabelle2
+-------+-------+
| level |   id  |
+-------+-------+
|   0   |   5   |
|   1   |   1   |
|   2   |   3   |
|   2   |  10   |
|   1   |   8   |
|   2   |   2   |
|   3   |   7   |
|   3   |   9   |
|   2   |   4   |
|   2   |   6   |
+-------+-------+

Daraus kann ich z. B. folgenden TreeView basteln (was dann nicht das Problem sein sollte):

0  1  2  3
----------
5
|
+- 1
|  |
|  +- 3
|  |
|  +- 10
|
+- 8
   |
   +- 2
   |  |
   |  +- 7
   |  |
   |  +- 9
   |
   +- 4
   |
   +- 6

Die Frage ist nun, wie komme ich von tabelle1 zu tabelle2?
Ich habe zwar schon diverse Lösungsansätze, aber der Groschen ist noch nicht richtig gefallen.
Im Forum habe ich natürlich auch schon gesucht :-) aber auch http://forum.de.selfhtml.org/archiv/2004/3/75206/#m433175, was ein ähnliches Problem beschreibt, hat den Groschen nicht in Bewegung versetzt.

Hat jemand von euch einen Lösungsansatz?

Danke für jeden Tipp und
viele Grüße
  Horst

  1. Hallo Horst Reinelt,

    ich glaube, die Umformung ist unnötig, da du das mit einer einzigen (rekursiv aufgerufenen) Funktion lösen kannst.

    Pseudo-Code, da ich kein Perl kann:

    Funktion(parent)
      "SELECT id FROM <tabelle> WHERE parent = " & parent
      Schlaufe für jeden Datensatz
        id ausgeben
        Funktion mit id als Parameter aufrufen: Funktion(id)
      Loop
    Ende Funktion

    Funktion erstmals aufrufen: Funktion(0)

    Hoffe, das war jetzt einigermassen verständlich...

    Gruss,
    Daniel

    1. Hi,

      Funktion(parent)
        "SELECT id FROM <tabelle> WHERE parent = " & parent
        Schlaufe für jeden Datensatz
          id ausgeben
          Funktion mit id als Parameter aufrufen: Funktion(id)
        Loop
      Ende Funktion

      es ist performanter die gesamte Datensatzmenge erst einmal in ein Array zu holen und erst dann darauf eine Funktion loszulassen, die die angeforderte Umformung durchfuehrt.

      Die Umformungsfunktion durchlaeuft dabei die o.g. Datensatzmenge und baut sich Datensatz fuer Datensatz die neue Struktur. Dabei ist in die neue Strukur jeweils an bestimmten zu ermittelnden Stellen ein Datensatz einzufuegen. Beide Strukturen habe dieselbe Anzahl Datensaetze. Die Reihenfolge ist bei der zweiten Struktur wichtig, d.h. diese transportiert Information.

      Gruss,
      Ludger

      --
      "Die SPD im Aufwind?"
    2. Hallo Daniel!

      ich glaube, die Umformung ist unnötig, da du das mit einer einzigen (rekursiv aufgerufenen) Funktion lösen kannst.

      Das erste Ergebnis sieht recht vielversprechend aus - und das mit sechs Zeilen Code!

      Vielen Dank
        Ciao Horst