既存のデータ (名前、lft、rgt):
Root, 1, 4
Item1, 2, 3
次のように見えます:
- Root
--- Item1
新しいノード (Item2) を Item1 の下に挿入するにはどうすればよいですか? 私のシステムの現在のロジックは、オンラインで見つけたほとんどの例に従いますが、結果は Item2 ABOVE Item1 です。
- Root
--- Item1
--- Item2
お手伝いありがとう。
既存のデータ (名前、lft、rgt):
Root, 1, 4
Item1, 2, 3
次のように見えます:
- Root
--- Item1
新しいノード (Item2) を Item1 の下に挿入するにはどうすればよいですか? 私のシステムの現在のロジックは、オンラインで見つけたほとんどの例に従いますが、結果は Item2 ABOVE Item1 です。
- Root
--- Item1
--- Item2
お手伝いありがとう。
ネストされたセット モデルは、開始タグと終了タグが存在する行であるXML
ファイルのように考えてください。lft
rgt
1 <root>
2 <item1>
3 </item1>
4 </root>
に新しいサブタグを挿入するにはroot
、後続のすべてのレコードを下にシフトする必要があります。
1 <root>
2 <item1>
3 </item1>
4 <item2>
5 </item2>
6 </root>
item2.lft
したがって、 and item2.rgt
(これはitem2.rgt + 1
andでありitem1.rgt + 2
、それに応じて)を計算する必要があります 。lft
rgt
item1.rgt
UPDATE mytable
SET rgt = rgt + 2
WHERE rgt > item1.rgt
UPDATE mytable
SET lft = lft + 2
WHERE lft > item1.rgt
「正解」が正しいとは思いません。あなたがすべきことは次のとおりです。 set item2.lft = root.rgt (4) set item2.rgt = root.rgt + 1 (5)
UPDATE mytable SET rgt = rgt + 2 WHERE rgt >= root.rgt root.rgt は現在 6 です。
UPDATE mytable SET lft = lft + 2 WHERE lft > root.rgt root.lft は同じ (1) のままですが、ルートが複数ある場合、それらは更新されます。
ピア エントリを使用して lft 値と rgt 値を決定することはできません。
Root, 1, 6
Item1, 2, 3
Item2, 4, 5
と使用しますORDER BY ItemName
が、もちろん、これは特定の兄弟セットに対してのみ機能します。
挿入方法については、5 番目のクエリを参照してください: http://intelligent-enterprise.informationweek.com/001020/celko.jhtml;jsessionid=OOU0L1TIM1IB1QE1GHPSKH4ATMY32JVN
実行しなければならないの数を最小限に抑えるために、数字の間にギャップを設けている人UPDATE
もいます。ただし、このパフォーマンスの問題は部分的にしか軽減できず、ネストされたセット モデルに固有のものです。このため、多くの人が具体化されたパスなどの他の階層モデルを実装しています。