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;
current
to odtwarzacze CDselected
to przodkowie odtwarzaczy CD (elektronika, przenośna elektronika, odtwarzacze CD)descendant
jest jakimkolwiek dzieckiem lub wnukiem itp. każdegoselected
przodekintermediate
jest potomkiem każdegoselected
przodek, który jest także rodzicemdescendant
-- nie może być żadnego z nich, stądIS NULL
ograniczenie.c
jest łańcuchem przodków oddescendant
z 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.