Ik weet niet zeker of ik dat allemaal volg, maar het klinkt alsof je alle directe kinderen van categorie 5 wilt.
Hier is een manier om dat te doen:
SELECT child.*
FROM Category parent
JOIN Category child
ON (child.lft BETWEEN parent.lft AND parent.rgt)
LEFT JOIN Category intermediate
ON (intermediate.lft > parent.lft AND intermediate.rgt < parent.rgt
AND child.lft > intermediate.lft AND child.rgt < intermediate.rgt)
WHERE intermediate.CategoryId IS NULL
AND parent.CategoryId = ?;
bewerken: Oké, ik begrijp nu dat de bovenstaande oplossing slechts een deel is van wat je wilt. Je wilt:
- Directe voorouders van cd-spelers
- "Ooms" van cd-spelers (broers en zussen van voorouders)
- Bussen van cd-spelers
- Kinderen van cd-spelers
Laat me daar een paar minuten aan werken.
Dit is wat ik heb bedacht:
SELECT descendant.*,
(current.lft BETWEEN descendant.lft AND descendant.rgt) AS is_selected,
COUNT(DISTINCT c.CategoryId) AS depth
FROM Category current
JOIN Category selected
ON (current.lft BETWEEN selected.lft AND selected.rgt)
JOIN Category descendant
ON (descendant.lft BETWEEN selected.lft AND selected.rgt)
LEFT JOIN Category intermediate
ON (intermediate.lft > selected.lft AND intermediate.rgt < selected.rgt
AND descendant.lft > intermediate.lft AND descendant.lft < intermediate.rgt)
JOIN Category c
ON (descendant.lft BETWEEN c.lft AND c.rgt)
WHERE intermediate.CategoryId IS NULL
AND current.CategoryId = ?
GROUP BY descendant.CategoryId
ORDER BY depth, descendant.name;
current
is cd-spelersselected
is voorouders van cd-spelers (elektronica, draagbare elektronica, cd-spelers)descendant
is een kind of kleinkind enz. van elkeselected
voorouderintermediate
is een afstammeling van elkeselected
voorouder die ook een ouder is vandescendant
-- deze mogen er niet zijn, vandaar deIS NULL
beperking.c
is de keten van voorouders vandescendant
terug naar boven, om de diepte te bepalen.
Ik realiseerde me net dat mijn oplossing ook alle nakomelingen van de current
. zou opleveren knooppunt. Dus als je momenteel naar 'draagbare elektronica' kijkt, zou de zoekopdracht de kinderen retourneren, maar ook de 'flits' van het kleinkind, wat misschien niet is wat je wilt.