3

既存のデータ (名前、lft、rgt):

Root, 1, 4
Item1, 2, 3

次のように見えます:

- Root
--- Item1

新しいノード (Item2) を Item1 の下に挿入するにはどうすればよいですか? 私のシステムの現在のロジックは、オンラインで見つけたほとんどの例に従いますが、結果は Item2 ABOVE Item1 です。

- Root
--- Item1
--- Item2

お手伝いありがとう。

4

3 に答える 3

4

ネストされたセット モデルは、開始タグと終了タグが存在する行であるXMLファイルのように考えてください。lftrgt

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 + 1andでありitem1.rgt + 2、それに応じて)を計算する必要がありますlftrgtitem1.rgt

UPDATE  mytable
SET     rgt = rgt + 2
WHERE   rgt > item1.rgt

UPDATE  mytable
SET     lft = lft + 2
WHERE   lft > item1.rgt
于 2010-02-01T14:49:51.133 に答える
2

「正解」が正しいとは思いません。あなたがすべきことは次のとおりです。 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 値を決定することはできません。

于 2012-01-11T18:41:16.573 に答える
1
Root, 1, 6
Item1, 2, 3
Item2, 4, 5

と使用しますORDER BY ItemNameが、もちろん、これは特定の兄弟セットに対してのみ機能します。

挿入方法については、5 番目のクエリを参照してください: http://intelligent-enterprise.informationweek.com/001020/celko.jhtml;jsessionid=OOU0L1TIM1IB1QE1GHPSKH4ATMY32JVN

実行しなければならないの数を最小限に抑えるために、数字の間にギャップを設けている人UPDATEもいます。ただし、このパフォーマンスの問題は部分的にしか軽減できず、ネストされたセット モデルに固有のものです。このため、多くの人が具体化されたパスなどの他の階層モデルを実装しています。

于 2010-02-01T14:40:42.490 に答える