# Nested Set nur eine Ebene tief aulesen



## schmidex (2. Dezember 2007)

Hallo zusammen. Ich habe mich mal an Nested Sets gewagt. Und stoße auf zahlreiche Probleme. Vielleicht kann mir hier ja jemand helfen.

Habe mir einen Baum nach einem Tutorial zu Testzwecken erstellt.






Zu jedem Eintrag gehört nur.. id,name,lft,rgt

Wie kann ich jetzt mit einer einzelnen SQL query nur die ersten Nachkommen einer bestimmten ID auslesen.

Beispiel:
Meine Wurzel hat die ID=1. Ich will zu dieser ID meiner einer Query nur die beiden direkten Nachkommen Primaten und Nagetiere erhalten. Nichts, was tiefer im Baum liegt. Ist das möglich? Danke schonmal.

Hoffe ich habe mein Problem einigermaßen gut beschrieben.


----------



## marbe (4. Dezember 2007)

Hallo,

schau doch mal nach Bäumen und Hierachien mit SQL
z.B. http://reeg.junetz.de/DSP/node11.html
http://www.yafla.com/papers/sqlhierarchies/sqlhierarchies.htm

Nur zwei Kandidaten. Ansätze gibt es viele für das Problem. Hauptknackpunkt ist es die Rekursion in den griff zu bekommen.

Vielleicht findest Du ja ein passenden Ansatz in den Links.


----------



## chainy (24. Februar 2008)

Moin,

ich wollte diesen Thread nochmal auffrischen und Fragen ob schmidex denn zu einem Ergebnis gekommen ist. Ich hänge gerade an demselben Problem. Wäre nett, wenn Du die Lösung präsentieren könntest, sofern Du zu einer gekommen bist.

Vielen Dank.


----------



## chainy (24. Februar 2008)

Ich hab das Problem jetzt lösen können, also falls jemand mal das selbe Problem haben sollte, hier ein Lösungsansatz. 
Als Grundlage für das nachfolgendet Statement hab ich eine Grafik dem Beitrag beigefügt. 
Möchte man jetzt nur die direkten Nachfahren von "Säugetiere" ermitteln dann könnte man dies so machen: 

```
SELECT 
    o.*,
    COUNT(p.id)-1 AS level
FROM NestedSet AS n, 
    NestedSet AS p, 
    NestedSet AS o 
WHERE o.lft BETWEEN p.lft AND p.rgt 
    AND o.lft BETWEEN n.lft AND n.rgt
    AND n.id = 1 
GROUP BY o.lft
HAVING level = 1
ORDER BY o.lft
```

Alle direkten Nachfahren von "Säugetiere" haben als "level" den Wert 1, die Einschränkung hierzu erfolgt im Having-Teil.

Falls jemand einen anderen Lösungsweg hat, nur zu, würde mich selbstverständlich auch interessieren.


----------

