Nie jestem pewien, czy śledzę to wszystko, ale wygląda na to, że chcesz mieć wszystkie najbliższe dzieci z kategorii 5.
Oto sposób, aby to zrobić:
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 = ?;
edytuj: OK, teraz rozumiem, że powyższe rozwiązanie jest tylko częścią tego, czego chcesz. Chcesz:
- Bezpośredni przodkowie odtwarzaczy CD
- "Wujkowie" odtwarzaczy CD (rodzeństwo przodków)
- Rodzeństwo odtwarzaczy CD
- Dzieci odtwarzaczy CD
Pozwól, że popracuję nad tym przez kilka minut.
Oto, co wymyśliłem:
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;
currentto odtwarzacze CDselectedto przodkowie odtwarzaczy CD (elektronika, przenośna elektronika, odtwarzacze CD)descendantjest jakimkolwiek dzieckiem lub wnukiem itp. każdegoselectedprzodekintermediatejest potomkiem każdegoselectedprzodek, który jest także rodzicemdescendant-- nie może być żadnego z nich, stądIS NULLograniczenie.cjest łańcuchem przodków oddescendantz powrotem do góry, w celu określenia głębokości.
Właśnie zdałem sobie sprawę, że moje rozwiązanie zwróci również wszystkich potomków current węzeł. Jeśli więc przeglądasz obecnie „przenośną elektronikę”, zapytanie zwróciłoby jego elementy potomne, ale zwróciłoby również „flash” wnuka, który może nie być tym, czego chcesz.