Tim: mySQL 5: Schleife in SQL-Query? oder "rekursive Abfrage"?

Hallo Forum,

ich wende mich an euch, weil ich folgendes Problem habe: Ich habe in einer Tabelle hierachisch organisierte Einträge, etwa so:

------------------------------
| id |    name    |  parent  |

| 1  | Toplevel   |    0     |
------------------------------
| 2  | Ebene 2    |    1     |
------------------------------
| 3  | Ebene 2a   |    1     |
------------------------------
| 4  | Ebene 3    |    2     |
------------------------------
| 5  | Ebene 4    |    4     |
------------------------------

Ich möchte jetzt, mit einem SQL-Query beispielsweise die Ebene 4 selektieren, aber _gleichzeitig_ in diesem Query alle übergeordneten Einträge haben. Also wären das für Ebene 4 -> Ebene 3 -> Ebene 2 -> Toplevel.

Das ginge jetzt entweder mit Joins oder einer Schleife in PHP. Beides ist aber entweder unflexibel oder langsam. Problem ist, dass ich nie weiß, wieviele Ebenen es geben wird, die Anzahl an JOIN-Queries also steigen kann und ich weiß nicht, wie hoch.

Gibt es die Möglichkeit eine Art rekursive Abfrage mit Joins zu machen? Oder in SQL eine Schleife einzubauen?

Ich hoffe, dass mir jemand helfen kann!

Einen schönen Tag!
Tim

  1. echo $begrüßung;

    Gibt es die Möglichkeit eine Art rekursive Abfrage mit Joins zu machen? Oder in SQL eine Schleife einzubauen?

    Es gibt Nested Sets, die für solche Probleme und eine Menge andere Fragen eine Anwort liefern können.

    echo "$verabschiedung $name";

  2. Tja, unverhofft kommt oft! Sorry für das schnelle Posting, ich merke gerade, der Schlüssel heißt "Stored Procedures" ... leider kapier ich die noch nicht so ganz, aber der Thread hier ist dann mehr oder weniger überflüssig!

    Tim

    1. Moin!

      Tja, unverhofft kommt oft! Sorry für das schnelle Posting, ich merke gerade, der Schlüssel heißt "Stored Procedures" ... leider kapier ich die noch nicht so ganz, aber der Thread hier ist dann mehr oder weniger überflüssig!

      Nein. Auch mit Stored Procedures kriegst du irgendwann ein Performanceproblem.

      Entweder, dein Datensatz bleibt so klein, dass die rekursive Speicherung in der DB in SQL irrelevant ist, weil immer eine Gesamtabfrage mit anschließender Einsortierung in eine PHP-Datenstruktur erfolgen kann, oder die Daten sind für solche Spielchen zu groß.

      Nested Sets wären die bessere Lösung. Die erfordern allerdings etwas mehr Gehirnschmalz zum Verständnis. :)

      - Sven Rautenberg

      1. yo,

        Nested Sets wären die bessere Lösung. Die erfordern allerdings etwas mehr Gehirnschmalz zum Verständnis. :)

        oder aber als alternative könnte man einen wechsel zu einem dbms wie oracle anraten, die können nämlich mit solchen strukturen umgehen....

        Ilja