Re: navigation mit mysql und nested set
am 21.09.2004 00:40:12 von Uli HonalSusanne Kaufmann wrote:
> Hallo, also ich verwende jetzt nested tree sets, um eine Menüstruktur=
=20
> darzustellen. Mein Problem ist, dass ich die nciht vernünftig ausgege=
ben=20
> bekomme. Das ganze soll so aussehen, dass wenn eine Kategorie ausgewä=
hlt=20
> wurde, diese quasi aufklappt.
>=20
> Beispiel:
>=20
> 1. Hardware
> 2. Software
>=20
> jetzt wird AMD ausgewählt:
>=20
> 1. Hardware
> 1.1 Laufwerke
> 1.2 Prozessoren
> 1.2.1 AMD
> 1.2.2 INTEL
> 1.3Speicher
> 2.Software
>=20
> Es soll also der ganze Baum aufgeklappt werden.=20
Der ganze? Das wäre zu einfach. ;-) Ich nehme an, Du möchtest nur den=
=20
"relevanten" Teil aufklappen, z.B. im obigen Beispiel weder die=20
Lauwerke, noch die Software usw...
Genauer formuliert willst Du also vielleicht einen Teilbaum, der nur=20
die "Ebenen" enthält, die zu einem Ausgewählten Knoten "führen", pl=
us=20
den ausgewählten Knoten selbt, und vermutlichen dessen Unterelemente=20
falls vorhanden ("Athlon", "Opteron", ...). Jede dieser "Ebenen" soll=20
mit allen direkten Unterlementen ausgegeben werden. Im Beispiel:=20
"Hardware" mit dessen direkten Unterelementen "Laufwerke",=20
"Prozessoren" und "Speicher". Weiterführend ist davon "Prozessoren",=20
also davon wiederum alle direkten Unterlemente "AMD" und "INTEL".
Hab ich das richig verstanden?
Wenn ja, dann lässt sich das dank Nested Sets sehr schön und einfach =
in einem SELECT lösen.
> [...] Ich habe eine MYSQL-Tabelle kategorien, die die=20
> Felder name, l, r enthällt.
Füge noch eine ID als Primärschlüssel hinzu, damit du die Kategorie=
=20
auch schön refenzieren kannst, z.B. in einer Produkte-Tabelle.
Füge ausserdem in diesem Fall noch die Tiefe (Level) als Spalte ein,=20
das erleichtert den (lesenden) Umgang mit den Nested Sets. Ist nicht=20
nötig, aber spart ein JOIN.
Die Abfrage lautet dann:
SELECT k.id, k.name, k.lvl
FROM kategorien AS k
INNER JOIN kategorien AS active
ON active.id =3D 6 /* <-- User hat "AMD" ausgewählt */
LEFT OUTER JOIN kategorien AS parent
ON k.lft BETWEEN parent.lft AND parent.rgt
AND k.lvl =3D parent.lvl + 1
WHERE
active.lft BETWEEN k.lft AND k.rgt
OR
active.lft BETWEEN parent.lft AND parent.rgt
ORDER BY k.lft
Ein vollständiges Beispiel lebt hier:
http://paste.phpfi.com/30497
Zum nachvollziehen am besten die erste Zeile mal in "SELECT *" ändern, =
und denn ganzen WHERE-Teil auskommentieren...
In meinen Augen war das mehr ein SQL- als ein PHP-Problem.... Ich=20
erlaube mir mal wenigstens ein xpost & f'up2 dclp.datenbanken.
cheers,
-Uli
--=20
netzgeist )) information movement