Не съм сигурен, че спазвам всичко това, но звучи така, сякаш искате всички непосредствени деца от категория 5.
Ето начин да направите това:
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 = ?;
редактиране: Добре, сега разбирам, че решението по-горе е само част от това, което искате. Искате:
- Преки предшественици на CD плейърите
- „Чичовци“ на CD плейъри (братя и сестри на предците)
- Братя и сестри на CD плейъри
- Деца на CD плейъри
Нека поработя върху това за няколко минути.
Ето какво измислих:
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
е CD плейъриselected
е предшественик на CD плейърите (електроника, преносима електроника, CD плейъри)descendant
е всяко дете или внуче и т.н. от всекиselected
прародителintermediate
е потомък на всекиselected
предшественик, който също е родител наdescendant
-- не трябва да има нито едно от тях, следователноIS NULL
ограничение.c
е веригата от предци отdescendant
обратно към върха, за целите на определяне на дълбочината.
Току-що разбрах, че моето решение също ще върне всички потомци на current
възел. Така че, ако в момента преглеждате „преносима електроника“, заявката ще върне нейните деца, но също така ще върне „flash“ на внука, което може да не е това, което искате.