【发布时间】:2013-10-07 17:23:26
【问题描述】:
我目前面临一个无法解决的问题。我为所有类别使用嵌套集,当我需要移动它们时,会出现某种错误。 我的问题是,如果我想移动一个节点 - 例如ID=2从“顶层”改为underlay ID=1,将ID=1上的Rgt=1和Lft=4+ID=2上的Rgt=2和Lft=3,就可以了。
问题是,如果我尝试将 ID=2 的节点移动到最后一个节点 - ID=5,Rgt=9,Lft=10,那么它真的毁了我的表 - 我看不到什么mySQL 查询出错了 - 希望您能帮忙...
我的桌子 WHEN I START 是这样的:
ID | Name | Rgt | Lft | ParentID
---+-------------+------+-----+---------
1 | Trousers | 1 | 2 | 0
---+-------------+------+-----+---------
2 | Jeans | 3 | 4 | 0
---+-------------+------+-----+---------
3 | Tops | 5 | 6 | 0
---+-------------+------+-----+---------
4 | T-shirts | 7 | 8 | 0
---+-------------+------+-----+---------
5 | Shirts | 9 | 10 | 0
---+-------------+------+-----+---------
我的查询是这样的:
SELECT
@node_id := '2',
@node_pos_left := '3',
@node_pos_right := '4',
@parent_id := '5',
@parent_pos_right := '10';
SELECT
@node_size := @node_pos_right - @node_pos_left + 1;
UPDATE ss_C_Categories
SET Lft = 0-(Lft), `Rgt` = 0-(Rgt)
WHERE Lft >= @node_pos_left AND Rgt <= @node_pos_right;
UPDATE ss_C_Categories
SET Lft = Lft - @node_size
WHERE Lft > @node_pos_right;
UPDATE ss_C_Categories
SET Rgt = Rgt - @node_size
WHERE Rgt > @node_pos_right;
UPDATE ss_C_Categories
SET Lft = Lft + @node_size
WHERE Lft >= IF(@parent_pos_right > @node_pos_right, @parent_pos_right - @node_size, @parent_pos_right);
UPDATE ss_C_Categories
SET Rgt = Rgt + @node_size
WHERE Rgt >= IF(@parent_pos_right > @node_pos_right, @parent_pos_right - @node_size, @parent_pos_right);
UPDATE ss_C_Categories
SET
Lft = 0-(Lft)+IF(@parent_pos_right > @node_pos_right, @parent_pos_right - @node_pos_right - 1, @parent_pos_right - @node_pos_right - 1 + @node_size),
Rgt = 0-(Rgt)+IF(@parent_pos_right > @node_pos_right, @parent_pos_right - @node_pos_right - 1, @parent_pos_right - @node_pos_right - 1 + @node_size)
WHERE Lft <= 0-@node_pos_left AND Rgt >= 0-@node_pos_right;
UPDATE ss_C_Categories
SET ParentID = @parent_id
WHERE CategoryID = @node_id;
执行查询后,我的表格如下所示:
ID | Name | Rgt | Lft | ParentID
---+-------------+------+-----+---------
1 | Trousers | 1 | 2 | 0
---+-------------+------+-----+---------
2 | Jeans | 10 | 11 | 5
---+-------------+------+-----+---------
3 | Tops | 5 | 6 | 0
---+-------------+------+-----+---------
4 | T-shirts | 3 | 4 | 0
---+-------------+------+-----+---------
5 | Shirts | 7 | 8 | 0
---+-------------+------+-----+---------
我用这个答案作为我如何做这些动作的灵感:https://stackoverflow.com/a/1274175/1308905
【问题讨论】:
标签: mysql nested-sets