2010-11-19 9 views
0

ネストされたセットによって編成された行のデータベースがあります。これはマルチティアのアフィリエイトサイトであると思われるサイトからのものですが、以前のプログラマは単純な階層システムではなくネストされたセットを使用することを決定しました。したがって、ほとんどすべての行は、階層化されたメンバを別の階層に移動しようとすると大きな苦痛になります。以下のコードはネストされたセットを別のものに移動するはずですが、問題は左と右の値が想定されていないコードを実行した後で、何千もの数字になります。もう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; 

答えて

0

私はネストされたセットをSQLで使用したことはありませんが、私はそれらについて読んだことがあります。

ジョー・セルコはとても詳細はこちら

のために、「ジョー・セルコ、ネストされたセット」をグーグルトピックを幅広く書かれた良い場所かもしれないのGoogleブックスで彼の本へのリンクがあまりにもCelko's Trees and Hierarchies

を開始します
関連する問題