6

ネストされたセットを使用してツリーを DB に格納しています。テーブルのフィールドは、id、lft、rgt、および name です。

ノード ID を指定すると、それ自体がリーフ ノードである直接の子 (孫ではない) をすべて見つける必要があります。

4

3 に答える 3

6

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設定されます。駄洒落を許してください。

于 2008-11-25T03:25:50.247 に答える
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により、出力内の冗長なエントリが削除されます。

于 2011-02-17T22:13:26.487 に答える
-1

葉ノードを指定して区別するために、左=右でそれらを保持します。これにより、次の 2 つの点が変更されます。

  1. 葉は簡単に識別できます。
  2. 挿入を行う場合、値に 1 つだけ追加します (左の場所 > 新しいリーフ、右の場所 >= リーフ)。
于 2010-09-22T19:22:43.543 に答える