Nested Sets - nur teilweise aufklappen
saurier
- datenbank
Vorab: Mein Problem bezieht sich auf die Erklärung zu den Nested Sets von Arne Klempert:
http://www.klempert.de/nested_sets/
Ich knüpfe dort an, wo er leider aufgehört hat.
Wir haben also folgenden Baum:
Säugetiere
Primaten
Halbaffen
Affen
Nagetiere
Mäuse
Wie man sieht, habe ich unter "Nagetiere" Das Kind "Mäuse" angehängt.
Das ganze soll ein Menü auf einer Webseite werden wie man sie ja recht häufig im Web sieht.
Leider erklärt Arne nur, wie man den gesamten Baum anzeigt ODER den Pfad zu einem Kind.
Ich brauche sone art Mittelding welches ich hier anhand folgender Grafik verdeutlichen will:
Wir befinden uns gerade auf der "Nagetiere"-Seite.
Säugetiere
Primaten
Nagetiere
Mäuse
Wie unschwer zu erkennen ist, will ich nur den Weg zum aktuellen Ast anzeigen und dessen Kinder (in diesem Fall: Mäuse).
Wenn ich jetzt auf "Nagetiere" wäre, müsste das set folgendermaßen aussehen:
Säugetiere
Primaten
Halbaffen
Affen
Nagetiere
Wie muss die Abfrage lauten die Arne leider ausgelassen hat??
LG
Hi!
Wie unschwer zu erkennen ist, will ich nur den Weg zum aktuellen Ast anzeigen und dessen Kinder (in diesem Fall: Mäuse).
Betrachte in einem solchen Fall immer die L- und R-Werte der Knoten, die du haben möchtest und diejenigen von denen du sie nicht haben möchtest. Finde dazu die Gesetzmäßigkeit. Für manche Fälle ist es auch noch hilfreich, zur einfacheren Abfrage eine Level-Spalte extra mitzuführen, wobei man das Level aber auch gegen den Aufpreis eines Subselects rausbekommt.
Wenn du auf Primaten stehst[*] willst du alle Elemente mit L größer dem Primaten-L und R kleiner dem Primaten-R, was die Kinder ergibt. Zudem willst du alle Elemente mit einem Level kleiner oder gleich dem von Primaten.
Schwieriger wird es bei weiteren Verschachtelungen, denn wenn du da nach dem Level gehst, klappt es auch Neffen und Nichten auf. Wenn du Halbaffen anzeigst, willst du (neben dessen Kindern und den Baum hochzu) nur die Affen und Nagetiere, nicht aber die Unterordnungen der Nagetiere, die ja auf dem gleichen Level sind wie die Halbaffen.
Säugetiere
Primaten
Halbaffen
Feuchtnasenaffen
Trockennasenaffen
Affen
Neuweltaffen
Altweltaffen
Nagetiere
Hörnchenverwandte
Brötchen
Croissant
Baguette
Biberverwandte
...
Mäuseverwandte
Dornschwanzhörnchenverwandte
Stachelschweinverwandte
Da fallen mir nur mehrfache Einzelabfragan ein, die mit UNION verbunden werden, wobei dabei gleich Dopplungen rausfallen.
Das wird noch komplexer, je weiter runter du im Bum steigst und je weniger niedrigere Level du aufgeklappt darstellen willst. Aber vielleicht hab ich da nur eine Gesetzmäßigkeit übersehen, die das Ganze einfacher macht.
Leider erklärt Arne nur, wie man den gesamten Baum anzeigt ODER den Pfad zu einem Kind.
Es gibt auch mindestens ein Tutorial, das mehr Abfragen zeigt, unter anderem auch in Verbindung mit dem Level.
[*] Schönen Gruß von der Doppeldeutigkeit.
Lo!
Tach.
Wie unschwer zu erkennen ist, will ich nur den Weg zum aktuellen Ast anzeigen und dessen Kinder (in diesem Fall: Mäuse).
Na formuliert hast Du Deine Zielstellung ja bereits völlig korrekt. Du brauchst:
(1) den aktuellen Knoten,
(2) den Pfad von der Wurzel zum aktuellen Knoten und
(3) alle direkten Kinder dieses Pfades
(1) kann man als gegeben ansehen. (2) ist nichts anderes als die Menge der Knoten, für die knoten.L < aktuellerKnoten.L < knoten.R gilt. (3) ist dann auch wieder recht einfach, nämlich die Menge aller Knoten, deren Elternknoten Bestandteil der Menge (2) ist.
Die Teilergebnisse kannst Du entweder, wie dedlfix vorschlägt, über UNION
verbinden oder über Self Joins der Knotentabelle oder …