Chris: Baumtsrukur aus DB in Menü

Hallo zusammen,

ich beschäftige mich jetzt seit eniger Zeit mit einder Datenbank die Ordner in einer Baumstrulur abzeichnen soll, bekomme aber die Datensätze in der Datenbank nicht wieder in das gewünschte Ausgabeformat als Menü zurück.

DB:

id = (ordner id),
parent_id = (die mutter :-)),
level (ordner level 0,1,2,3,4...),
name

Ich habe mir das ganz einfach via SQL Select durch die Order By Klausel zurechtgeordnet:

ORDER BY parent_id ASC,id ASC

Kriege aber die Baumstruktur einfach nicht richtig abgebildet.

Kann mir jemand sagen wie man sowas normalerweise macht ? Ich nutze php und MySQL.

Viele Grüße & danke

Chris

  1. Hallo Chris,

    ich beschäftige mich jetzt seit eniger Zeit mit einder Datenbank die Ordner in einer Baumstrulur abzeichnen soll,

    eine Möglichkeit, dieses zu lösen, wären Nested Sets. Ein paar lesenswerte Threads zu diesem Thema, auch den Nachteilen von Nested Sets:

    </archiv/2006/2/t123458/#m794964>
    </archiv/2006/3/t125135/>
    </archiv/2006/3/t125304/>
    </archiv/2006/3/t125344/>
    </archiv/2006/3/t125579/>

    Freundliche Grüße

    Vinzenz

  2. Hallo Chris,

    schreib doch mal die komplette sql-abfrage und die Struktur der Tabellen, so lässt sich das schwer beantworten.

    Gruß
    Alisha

    1. Hi Alisha,

      also, ich habe mich damit abgefunden das mein Vorhaben mit einer Abfrage nicht zu schaffen ist :-)

      Meine Tabelle:

      Ordner_ID
      Parent_Ordner_ID
      Level

      Die Tabellen stammen aus einer Wndows Anwendung und bilden eine Ornderstruktur ab, da kann ich nichts dran ändern.

      Mein Abfrage war so einfach wies nur geht, ich habe einfach mit ORDER BY nach der parent_ID geordnet, was ohne jede Ordnung war. Wenn jemand eine Idee hat wie ich ab einem bestimmten Startpunkt alle folgenden Kinder mit einer SQL Abfrage auslesen kann, immer her damit :-) (Wie in den Threads von Vincenz gelesen geht das ohne Nested Sets nicht ... ?)

      Ich muss mich da wohl rekursiv durchlagen:

      function getChilds ($pid, $tree = array()) {
        global $db;
        $res = $db->query("
         SELECT *
         FROM folder
         WHERE parent_id = ".(int)$pid."
        ");

      return $res->fetchAll(MDB2_FETCHMODE_ASSOC);
       }

      Hiermit komme ich schonmal an die Kinder eines Astes, aber ich benötige alle Kinder die auch noch dannach kommen, also alle Ableger die die gefunden Kinder wieder haben können :-)

      Ich muss einfach von einem bestimmten Punkt im Baum starten können und alle Nachfahren auslesen können ...

      Kann mir jemand verraten wie so eine Rekursiv Geschichte laufen sollte ? Ich habe sowas noch nie gemacht und stelle mich da irgendwie ein bischen blöd an :-)

      Viele Grüße

      Chris ...

      1. echo $begrüßung;

        also, ich habe mich damit abgefunden das mein Vorhaben mit einer Abfrage nicht zu schaffen ist :-)

        Wenn du auf Nested Set verzichten willst/musst und die Anzahl der Datensätze überschaubar bleibt, kannst du auch einfach alle Datensätze abfragen und das rekursive Sortieren in der Anwendung vornehmen.

        Kann mir jemand verraten wie so eine Rekursiv Geschichte laufen sollte ? Ich habe sowas noch nie gemacht und stelle mich da irgendwie ein bischen blöd an :-)

        Du fragst alle Datensätze der Ebene ab, mit der du beginnen möchtest - alle Wurzeln beispielsweise. Für jeden einzelnen Datensatz aus der Ergebnismenge fragst du nun alle Datensätze ab, die als Eltern-ID die ID des Datensatzes haben. Für jeden einzelnen Datensatz aus der Ergebnismenge fragst du nun alle Datensätze ab, die als Eltern-ID die ID des Datensatzes haben. Für jeden einzelnen Datensatz ...

        Auch bei Nested Sets kommst du nicht um eine Rekursion drumrum. Damit reduziert man nur die Anzahl der (teuren) Datenbankabfragen auf eine. Die Ergebnismenge ist wie üblich flach. Das Einsortieren in eine Baumdatenstruktur (verschachtelte Arrays) musst du in deiner Anwendung vornehmen.

        echo "$verabschiedung $name";

      2. Hallo Chris,
        ungefähr so:
        function getChilds($parent){
         $sql = "Select child from xx where parent = $parent"
         $erg = mysql_query ($sql, $dbh);
         while ($result = mysql_fetch_row($erg)){
            //aktuelles parent in Array speichern oder was auch immer du damit machen willst
            getChilds ($erg[0]);
         }
        }
        grüße
        alisha