У меня есть база данных строк, которые организованы с помощью вложенных множеств. Это сайт, который должен был быть многоуровневым партнерским сайтом, но предыдущий программист принял решение использовать вложенные множества вместо простой системы уровней, так что практически каждая строка влияет на каждую другую строку с точки зрения позиционирования, и это Это большая боль при попытке переместить многоуровневый элемент на другой уровень. Предполагается, что приведенный ниже код перемещает вложенный набор из одного в другой, но проблема в том, что после того, как я запустил код, левые и правые значения уже не те, которые должны быть, а тысячи раз. Другая трудность заключается в том, что каждая строка связана с другой строкой в той же таблице . Ниже приведен код 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` <= 0-@member_lft AND `rgt` >= 0-@member_rgt;