私がそれをすべてフォローしているのかどうかはわかりませんが、カテゴリ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;
currentCDプレーヤーですselectedCDプレーヤー(電子機器、携帯用電子機器、CDプレーヤー)の祖先ですdescendant各selectedの子または孫などです 祖先intermediate各selectedの子孫ですdescendantの親でもある祖先 -これらのいずれも存在してはならないため、IS NULL制限。-
cdescendantからの祖先のチェーンです 深さを決定するために、一番上に戻ります。
私のソリューションはcurrentのすべての子孫も返すことに気づきました ノード。したがって、現在「ポータブルエレクトロニクス」を表示している場合、クエリはその子を返しますが、孫の「フラッシュ」も返しますが、これは希望どおりではない可能性があります。