2

Managing Hierarchical Data in MySQLを見てきましたが、実際にはネストされたセット モデルのノードの追加と削除のみを扱います。

子ノードの有無にかかわらずノードを移動できる必要があります。

どうすればいいですか?

4

4 に答える 4

1

これは、単一の入力パラメーター (ノードの新しい左位置 (newpos)) だけでノードをツリー内の任意の位置に移動できるソリューションです。このメソッドは、子ノードなしではノードを移動できませんが、その使用例を知りたいです。

基本的には、次の 3 つのセットがあります。

  • サブツリー用の新しいスペースを作成します。
  • サブツリーをこのスペースに移動します。
  • サブツリーによって空になった古いスペースを削除します。

疑似 SQL では、次のようになります。

//
 *  -- create new space for subtree
 *  UPDATE tags SET lpos = lpos + :width WHERE lpos >= :newpos
 *  UPDATE tags SET rpos = rpos + :width WHERE rpos >= :newpos
 * 
 *  -- move subtree into new space
 *  UPDATE tags SET lpos = lpos + :distance, rpos = rpos + :distance
 *           WHERE lpos >= :tmppos AND rpos < :tmppos + :width
 * 
 *  -- remove old space vacated by subtree
 *  UPDATE tags SET lpos = lpos - :width WHERE lpos > :oldrpos
 *  UPDATE tags SET rpos = rpos - :width WHERE rpos > :oldrpos
 */

:distance 変数は新しい位置と古い位置の間の距離、:width はサブツリーのサイズ、:tmppos は更新中に移動されるサブツリーを追跡するために使用されます。これらの変数は次のように定義されます。

// calculate position adjustment variables
int width = node.getRpos() - node.getLpos() + 1;
int distance = newpos - node.getLpos();
int tmppos = node.getLpos();
        
// backwards movement must account for new space
if (distance < 0) {
    distance -= width;
    tmppos += width;
}

完全なコード例については、私のブログを参照してください。

https://rogerkeays.com/how-to-move-a-node-in-nested-sets-with-sql

このソリューションが気に入ったら、賛成票を投じてください。

于 2012-01-08T05:36:02.923 に答える
0

ノードを移動することは、ノードとそのすべての子 (存在する場合) を削除し、ノードとその子 (存在する場合) を新しい位置に挿入することと同じであると考えてください。

技術記事を読み直して、削除と挿入を行った後のテーブル全体がどのようになるかを調べてみると、同じことを行う更新が見つかります。

于 2009-04-11T01:31:11.310 に答える