ネストされたセットによって編成された行のデータベースがあります。これはマルチティアのアフィリエイトサイトであると思われるサイトからのものですが、以前のプログラマは単純な階層システムではなくネストされたセットを使用することを決定しました。したがって、ほとんどすべての行は、階層化されたメンバを別の階層に移動しようとすると大きな苦痛になります。以下のコードはネストされたセットを別のものに移動するはずですが、問題は左と右の値が想定されていないコードを実行した後で、何千もの数字になります。もう1つの難点は、各行が別の行に関連付けられていることです同じテーブルにあります。以下は私がここで別のポストから一緒にハッキングしたSQLコードなので、すべての助けに感謝します。ネストされたセットアイテムを移動するための複雑なSQLクエリのヘルプが必要
ありがとうございました。
# step 0: Initialize parameters.
SELECT
@member_id := e1.memberid,
@member_lft := e1.lft,
@member_rgt := e1.rgt,
@parent_id := e2.memberid,
@parent_rgt := e2.rgt,
@member_size := @member_rgt - @member_lft + 1
FROM ept_viewer e1
LEFT JOIN ept_viewer e2
#put the new parent id
ON e2.memberid = $
#put the child id
WHERE e1.memberid = $;
# step 1: temporary "remove" moving node
UPDATE `ept_viewer`
SET `lft` = 0-(`lft`), `rgt` = 0-(`rgt`)
WHERE `lft` >= @member_lft AND `rgt` <= @member_rgt;
# step 2: decrease left and/or right position values of currently 'lower' items (and parents)
UPDATE `ept_viewer`
SET `lft` = `lft` - @member_lft
WHERE `lft` > @member_rgt;
UPDATE `ept_viewer`
SET `rgt` = `rgt` - @member_size
WHERE `rgt` > @member_rgt;
# step 3: increase left and/or right position values of future 'lower' items (and parents)
UPDATE `ept_viewer`
SET `lft` = `lft` + @member_size
WHERE `lft` >= IF(@parent_rgt > @member_rgt, @parent_rgt - @member_size, @parent_rgt);
UPDATE `ept_viewer`
SET `rgt` = `rgt` + @member_size
WHERE `rgt` >= IF(@parent_rgt > @member_rgt, @parent_rgt - @member_size, @parent_rgt);
# step 4: move node (ant it's subnodes) and update it's parent item id
UPDATE `ept_viewer`
SET
`lft` = 0-(`lft`)+IF(@parent_rgt > @member_rgt, @parent_rgt - @member_rgt - 1, @parent_rgt - @member_rgt - 1 + @member_size),
`rgt` = 0-(`rgt`)+IF(@parent_rgt > @member_rgt, @parent_rgt - @member_rgt - 1, @parent_rgt - @member_rgt - 1 + @member_size)
WHERE `lft` <= [email protected]_lft AND `rgt` >= [email protected]_rgt;