ネストされたセットを使用してツリーを DB に格納しています。テーブルのフィールドは、id、lft、rgt、および name です。
ノード ID を指定すると、それ自体がリーフ ノードである直接の子 (孫ではない) をすべて見つける必要があります。
ネストされたセットを使用してツリーを DB に格納しています。テーブルのフィールドは、id、lft、rgt、および name です。
ノード ID を指定すると、それ自体がリーフ ノードである直接の子 (孫ではない) をすべて見つける必要があります。
MySQLでの階層データの管理の記事は、入れ子集合の使用方法の優れた例を示し、これを含む多くの一般的なクエリの例を示しています。
ノードの直接の子を見つける方法は次のとおりです。
SELECT node.name, (COUNT(parent.name) - (sub_tree.depth + 1)) AS depth
FROM nested_category AS node,
nested_category AS parent,
nested_category AS sub_parent,
(
SELECT node.name, (COUNT(parent.name) - 1) AS depth
FROM nested_category AS node,
nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND node.name = '**[[MY NODE]]**'
GROUP BY node.name
ORDER BY node.lft
)AS sub_tree
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt
AND sub_parent.name = sub_tree.name
GROUP BY node.name
HAVING depth = 1
ORDER BY node.lft;
rgt
次に、それをリーフノードがに等しくなるという事実と組み合わせると、lft + 1
設定されます。駄洒落を許してください。
データベースでネストされたセットを使用して多くの開発を行っています。親ノードの左と右の値は、常にその子の値の境界を設定します。
lft 値と rgt 値を使用して任意のノードの子を検索するには:
select
child.id,
child.lft,
child.rgt
from
nodes child,
nodes parent
where
child.lft between parent.lft and parent.rgt
and parent.id != child.id
and parent.id = [ID];
ここで行ったことは、子と親の同じテーブルへのエイリアスを作成し、指定された親ノードの間に収まる子を見つけたことです。これparent.id != child.id
により、出力内の冗長なエントリが削除されます。
葉ノードを指定して区別するために、左=右でそれらを保持します。これにより、次の 2 つの点が変更されます。