私がそれをすべてフォローしているのかどうかはわかりませんが、カテゴリ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
のすべての子孫も返すことに気づきました ノード。したがって、現在「ポータブルエレクトロニクス」を表示している場合、クエリはその子を返しますが、孫の「フラッシュ」も返しますが、これは希望どおりではない可能性があります。