1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

SQL Rekursion

Discussion in 'Programmieren' started by Don_Pazo, Feb 16, 2007.

Thread Status:
Not open for further replies.
  1. Don_Pazo

    Don_Pazo Byte

    Hallo,
    ich habe eine MySQL Datenbank mit folgende Tabellen:

    -------------------------
    ORDNER | ELTERN | KIND
    -------------------------
    root......| NULL ... | 1
    a_1.......| 1 ....... | 2
    a_2.......| 1 ....... | 3
    a_3.......| 1 ....... | 4
    b_1.......| 2 ....... | 5
    b_2.......| 2 ....... | 6
    b_3.......| 2 ....... | 7
    c_1.......| 4 ....... | 8
    d_1.......| 3 ....... | 55
    d_2.......| 3 ....... | 122




    Es siet ungeführ so aus:

    root_
    ...... | - a_1 _
    .................. | - b_1
    .................. | - b_2
    .................. | - b_3

    ...... | - a_2 _
    .................. | - d_1
    .................. | - d_2
    ............................................ // also hier können mehrere Unterordner kommen, oder Unter - Unterordner und soweiter.

    ...... | - a_3 _
    .................. | - c_1


    Wie kann ich eine Rekursive SQL-Abfrage aufbauen, damit man für einen Ordner (z.B a_2) alle Unterordner bekommt?

    Es können aber beliebig viele unter - unter Ordner in d_1 und d_2 ect. sein. Also die Verschachtelung ist nicht vorhersehbar!
     
  2. enschman

    enschman Megabyte

    Hi,

    Rekursion bekommt man nicht mit SQL, sondern mit dem jeweiligen Abfrage-Programm...

    Da müssen sich zur Abfrage Funktionen selbst aufrufen...

    Bsp:

    Tabelle:
    ID Integer (Primärschlüssel)
    Name Text (Ordnername)
    upper Integer (in welchem Ordner?)
    Root TinyInt (Ordner höchster Ebene? nein=0, ja=1)

    PHP:
    //mit PHP:
    //Rekursion:
    function unterordner(id as integer) {
    $sql="SELECT * FROM tabelle WHERE upper='".$id."' AND Root='0'";
    $result=mysql_query($sql);

    while (
    $row=mysql_fetch_array()) {
    echo 
    $row[Name]."<br />";
    unterordner($row[id]);
    }
    }

    //Ordner höchster Ebene:
    $sql="SELECT * FROM tabelle WHERE Root='1'";
    $result mysql_query($sql);

    while (
    $row=mysql_fetch_array()) {
    echo 
    $row[Name]."<br />";
    unterordner($row[ID]);
    }
    So ausm Kopf jetz, ausprobiert hab ichs jetzt mal nicht, Formatierung etc. sind dir überlassen...

    mfg Tenschman
     
  3. kalweit

    kalweit Hüter der Glaskugel

    Würde ich nicht so machen, da dies die Datenbank recht schnell ausbremst (zumal der TO sich inhaltlich ausschweigt). Wenn es der Speicher zulässt, würde ich die Tabelle in ein Feld einlesen und die Rekursion darauf anwenden. Damit bleibt nur eine DB-Abfrage übrig.
     
  4. enschman

    enschman Megabyte

    Hi,

    ohne richtige Angaben (welche Programmiersprache etc.) versuch ich natürlich die einfachste bzw. für mich schnellste Lösung zu posten, gibt sicher auch einige weitere Möglichkeiten, bei denen nur eine Abfrage nötig ist (z. B. in ein Array rein und dieses Array dann rekursiv auslesen...)

    mfg Tenschman
     
  5. kalweit

    kalweit Hüter der Glaskugel

    ...nicht fremde Vorschläge klauen ;)
     
  6. enschman

    enschman Megabyte

    Ach das hast du mit "in ein Feld einlesen" gemeint... sry, hab das falsch interpretiert (mehr so als SQL-Tabelle anpassen (automatisch) zu Unterordner1, Unterordner2, UnterordnerXYZ, zumindest hab ichs deshalb so interpretiert, da du geschrieben hast "falls es der Speicher erlaubt"...)

    mfg Tenschman
     
Thread Status:
Not open for further replies.

Share This Page