# SQL Abfrage zum erstellen einer Menu Hierarchie



## Ryu20 (19. Mai 2008)

Hi

ich habe eine Tabelle in mysql erstellt um ein menu damit aufzubauen (eine art tree) 

Hier die Struktur und ein paar Beispiel Daten der Tabelle:

ID | LABEL | PARENTID

1 | Root | 0
2 | K1 | 1
3 | K2 | 1
4 | K3 | 1
5 | K1-1 | 2
6 | K1-2 | 2

wenn ich jetzt eine ID angebe möchte ich alle datensätze haben die untermenüs von dieser ID sind.

Beispiel: ID = 2 dann möchte ich folgende Daten zurück:
5 | K1-1 | 2
6 | K1-2 | 2

Beispiel: ID = 1 dann möchte ich folgende Daten zurück:
2 | K1 | 1
3 | K2 | 1
4 | K3 | 1
5 | K1-1 | 2
6 | K1-2 | 2

usw.

Ist dies überhaupt mit so einer Struktur und einer SQL Abfrage möglich?
Ich hoffe jemand kann mir helfen.

Vielen Dank schonmal


----------



## Bernd1984 (19. Mai 2008)

Hallo Ryu20,

das ist möglich.

Am einfachsten ist es wenn du eine feste Anzahl von Ebenen hast.
Dann wird die Tabelle x mal mit sich selbst verknüpft (x= Anzahl Ebenen)


----------



## Ryu20 (19. Mai 2008)

Feste Anzahl von Ebenen habe ich nicht eingeplannt, aber vielleicht wäre das zu überlegen,

könntest du ein kleines Beispiel posten wie ich die Tabellen am besten miteinander verknüpfe? (bin leider noch nicht so fit in SQL )

Vielen Dank


----------



## Bernd1984 (19. Mai 2008)

Hallo Ryu20,

so ganz entspricht das nicht deinen Wunsch, da das Ergebnis etwas anders aussieht.

Schau es dir erstmal an:


```
SELECT     *
FROM         TabelleMenu LEFT OUTER JOIN
                      TabelleMenu TabelleMenu_1 ON TabelleMenu.ID = TabelleMenu_1.ParentId LEFT OUTER JOIN
                      TabelleMenu TabelleMenu_2 ON TabelleMenu_1.ID = TabelleMenu_2.ParentId
WHERE     (TabelleMenu.ParentId = 1)
```


----------



## shutdown (19. Mai 2008)

Es gibt zumindest in Oracle eine Funktion, die eine solche Baumstruktur einer Tabelle komplett aufdröselt - mit einem Select ohne Joins.

Der Name ist mir entfallen und ob's sowas für mysql gibt, weiß ich auch nicht sicher, aber such doch mal in der Richtung, schaden kann's nicht.


----------



## RaketenPeter (19. Mai 2008)

Moin Moin  
In SQL benutze ich sowas! 



> Es gibt ein einfaches Konstrukt, um Baumstrukturen beliebiger Tiefe abzubilden. Dazu wird eine Spalte eingefügt, in der der Schlüssel des Vorgängers eingetragen wird. Über die "CONNECT BY"-Klausel werden dann die Zeilen verknüpft. Die Pseudospalte "LEVEL" enthält die Ebene eines Objektes innerhalb der Baumstruktur.
> 
> create table mitarbeiter (
> pnr number(10),
> ...


----------



## Ryu20 (19. Mai 2008)

hi danke fuer die ganzen Antworten.

Bernd:
da bekomme ich alle gewuenschten angezeigt, aber leider ist dies nicht wirklich dynamisch.

in mysql gibt es auch leider kein connect by prior....

ich habe mich jetzt entschieden einen nested tree aufzubauen.
http://phpperformance.de/nested-sets-hierarchische-strukturen-und-baeume-in-mysql/


----------

