mysql中嵌套集模型更新子结点到别的父结点
时间: 2023-12-09 08:04:57 浏览: 27
在嵌套集模型中,更新子节点到其他父节点需要执行以下步骤:
1. 查询要移动的子节点及其所有后代节点的左右值。
2. 计算要更新的节点及其后代节点的左右值的偏移量。
3. 更新所有左值大于当前节点的左值且右值小于当前节点的右值的节点的左值和右值。
4. 更新所有左值大于当前节点的右值的节点的左值和右值。
5. 更新当前节点及其所有后代节点的左值和右值。
6. 更新所有左值大于或等于目标父节点的左值的节点的左值和右值。
7. 更新所有左值大于目标父节点的右值的节点的左值和右值。
下面是一个实现将嵌套集模型中的子节点移动到其他父节点的示例 SQL 查询:
```
SET @myLeft := 0, @myRight := 0, @offset := :offset;
SELECT lft, rgt, rgt - lft + 1 INTO @myLeft, @myRight, @size
FROM categories
WHERE id = :categoryId;
UPDATE categories
SET lft = CASE
WHEN lft BETWEEN @myLeft AND @myRight THEN lft + @offset
WHEN lft BETWEEN @parentLeft AND @parentRight THEN lft - @size
ELSE lft
END,
rgt = CASE
WHEN rgt BETWEEN @myLeft AND @myRight THEN rgt + @offset
WHEN rgt BETWEEN @parentLeft AND @parentRight THEN rgt - @size
ELSE rgt
END
WHERE rgt > @myRight OR lft BETWEEN @parentLeft AND @parentRight;
```
在这个查询中,`categories` 表存储了左右无限级关系的数据,`id` 列是节点的唯一标识符,`lft` 列是节点的左值,`rgt` 列是节点的右值。这个查询使用了 MySQL 的用户定义变量来保存当前节点的左右值和偏移量,然后更新所有需要更新的节点的左右值。其中,`@parentLeft` 和 `@parentRight` 分别是目标父节点的左值和右值。