Managing Hierarchical Data in MySQLを見てきましたが、実際にはネストされたセット モデルのノードの追加と削除のみを扱います。
子ノードの有無にかかわらずノードを移動できる必要があります。
どうすればいいですか?
Managing Hierarchical Data in MySQLを見てきましたが、実際にはネストされたセット モデルのノードの追加と削除のみを扱います。
子ノードの有無にかかわらずノードを移動できる必要があります。
どうすればいいですか?
これは、単一の入力パラメーター (ノードの新しい左位置 (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
このソリューションが気に入ったら、賛成票を投じてください。
ノードを移動することは、ノードとそのすべての子 (存在する場合) を削除し、ノードとその子 (存在する場合) を新しい位置に挿入することと同じであると考えてください。
技術記事を読み直して、削除と挿入を行った後のテーブル全体がどのようになるかを調べてみると、同じことを行う更新が見つかります。