Jag är inte säker på att jag följer allt det där, men det låter som att du vill ha alla omedelbara barn i kategori 5.
Här är ett sätt att göra det:
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 = ?;
redigera: Okej, jag förstår nu att lösningen ovan bara är en del av vad du vill ha. Du vill:
- Direkta förfäder till CD-spelare
- "Farbröder" till CD-spelare (syskon till förfäder)
- Syskon till CD-spelare
- Barn till CD-spelare
Låt mig jobba på det i några minuter.
Det här är vad jag har kommit fram till:
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;
aktuell
är CD-spelarevald
är förfäder till CD-spelare (elektronik, bärbar elektronik, CD-spelare)ättling
är något barn eller barnbarn etc. av varjevald förfader
mellanliggande
är en ättling till varjevald förfader som också är en förälder till
ättling
-- det får inte finnas några av dessa, därförÄR NULL
begränsning.c
är kedjan av förfäder frånättling
backa upp till toppen för att bestämma djupet.
Jag insåg precis att min lösning också skulle returnera alla avkomlingar till current
nod. Så om du för närvarande tittade på "bärbar elektronik" skulle frågan returnera sina barn, men den skulle också returnera barnbarnets "blixt" som kanske inte är vad du vill ha.