echo $begrüßung;
- Ich möchte die Statements ja nicht nur abtippen, sondern auch verstehen, leider steige ich bei der Verwendung von n.name (o.ä.) aus. Was hat es damit auf sich, ich habe leider nichts finden können, da mir auch der entsprechende Begriff fehlt um danach zu suchen.
SELECT feld FROM tabelle;
Hier ist es eindeutig, dass sich feld auf tabelle bezieht
SELECT feld FROM tabelle1, tabelle2;
Worauf bezieht sich nun feld? Diese Frage zu klären ist vor allem dann wichtig, wenn feld in beiden Tabellen vorkommt.
SELECT tabelle1.feld, tabelle2.feld FROM tabelle1, tabelle2;
Nun ist deutlich, welches feld gemeint ist. Für tabelle1 und tabelle2 kann man auch Alias-Namen vergeben, wobei das AS optional ist.
SELECT t1.feld, t2.feld FROM tabelle1 AS t1, tabelle2 t2;
Das Beispiel verwendet nun die Tabelle tree zweimal, ein so genannter Self-Join
SELECT n.name, ... FROM tree AS n, tree AS p WHERE n.lft BETWEEN p.lft AND p.rgt ...
Die beiden Tabellen n und p (dass jedes Mal die selbe Tabelle dahintersteckt ist erstmal nebensächlich) ergeben ein kartesisches Produkt, das heißt, jeder Datensatz von n wird mit jedem Datensatz von p verknüpft. Danach greift sich das WHERE die Knoten heraus, die Kinder anderer Knoten sind.
- Ist es bei Nested Sets überhaupt sinnvoll möglich, nachträglich bestimmte Elemente zu verschieben etc. oder muss ich dann immer den ganzen Baum neu berechnen?
Zumindest der Teil muss neu berechnet werden, dessen left-Werte (und damit auch right-Werte) größer sind als die des zu änderenden Knotens. Diese Neuberechnerei ist ein Nachteil von Nested Sets. Wenn sich die Struktur ständig (und noch dazu zu großen Teilen) ändert, muss man schon genau überlegen, ob der Mehraufwand den Einsatz von NS rechtfertigt.
Wenn ich zum Beispiel 2 Nachfahren vertaushcen möchte, geht das ja noch einfach, aber wenn ich einen Nachfahre zu einem Bruder seines Vorfahren machen möchte?
Solange keine Kinder dranhängen ist das noch einfach mit Löschen und Einfügen zu machen.
- Ich habe ja bei meiner Datenstruktur keine oberste Menge. oder ist meine oberste Menge dann einfach nicht existent und ich habe einfach für jede Kategorie gleich einen Nachfarhen in meiner Tabelle stehen?
Ein Root-Element muss vorhanden sein. Wenn du mehrere Root-Elemente hast, dann hast du quasi mehrere vollständige und unabhängige Bäume in einer Tabelle. Das geht, braucht aber ein Kennzeichen, zu welchem Baum das Element gehört. Und jeder Baum hat seine eigene Left-Right-Zählung, sonst klappen die diversen Abfrage-Formeln (= SELECT-Statements) nicht.
Also z.B. Kategorie a mit Uunterpunkten bcd und Kategorie e mit Unterpunkten gh
Müssten die LFT und RGT-Werte dann wie folgt aussehen:
a 1 5
b 2 6
c 3 7
d 4 8
e 9 12
g 10 13
h 11 14
Das ist ungültig. Ein Element ohne Nachfahren zeichnet sich dadurch aus, dass right gleich left+1 ist. Solche Elemente hast du nicht in deinem Baum.
Nested Sets ist schon ein mächiges und interessantes Werkzeug. Es ist nur die Frage, ob du für deinen Fall mit - ich vermute einfach mal - einer Handvoll Menüeinträge dieses mächtige Werzeug benötigst, oder ob nicht auch ein einfacher Verweis auf das Elternelement reicht, mit anschließendem Aufbau des Baums in der abfragenden Umgebung.
echo "$verabschiedung $name";