我必须通过脚本或sql修复损坏的嵌套集链。该表包含一个左侧值列和一个右侧值列,但没有父id列。我能够计算嵌套集合中每个节点的级别。左值和右值之间存在差距。计算级别的结构有效。有没有人知道通过SQL缩小差距的解决方案?(MySQL)
这些建议都不适合我的问题,但谢谢你的参与。
我为自己设计了一个解决方案: 1.第一步计算父I并转换为邻接表2.使用Joe Celko的方法将邻接表转换为嵌套集3.更新旧的左侧和右侧值
发布于 2009-10-05 18:20:06
我只需要从您拥有的left和right值生成一个parent_id列,然后重新生成left和right值。
如果您不想修改当前表,您甚至可以在临时表中进行修改。
发布于 2009-10-06 03:11:22
节点(c)的每个祖先具有较小的left和较大的right值。并且直接父代(p)是该(祖先)集中具有最大left值的父代。
例如。
CREATE TABLE nested (
id int AUTO_INCREMENT,
name varchar(16),
parentid int DEFAULT 0,
lft int(11),
rgt int(11),
PRIMARY KEY (id)
)
INSERT INTO
nested (name, parentid, lft, rgt)
VALUES
('1' ,0,1,20),
('1.1' ,0,2,9),
('1.1.1' ,0,3,4),
('1.1.2' ,0,5,6),
('1.1.3' ,0,7,8),
('1.2' ,0,10,19),
('1.2.1' ,0,11,14),
('1.2.1.1',0,12,13),
('1.2.2' ,0,15,16),
('1.2.3' ,0,17,18)
SELECT
p.id as pid, p.name as pname,
c.id as cid, c.name as cname
FROM
nested as c
LEFT JOIN
nested as p
ON
p.lft=(
SELECT
MAX(lft)
FROM
nested AS l
WHERE
c.lft > l.lft
AND c.lft < l.rgt
)返回
pid pname cid cname
NULL NULL 1 1
1 1 2 1.1
2 1.1 3 1.1.1
2 1.1 4 1.1.2
2 1.1 5 1.1.3
1 1 6 1.2
6 1.2 7 1.2.1
7 1.2.1 8 1.2.1.1
6 1.2 9 1.2.2
6 1.2 10 1.2.3发布于 2013-07-12 01:01:05
在嵌套集合中有4到5种不同的损坏情况是完全可以修复的(如果按正确的顺序完成)。Snaggle很容易防止与一个简单的触发检查,看看如果不是>=的权利。我已经按照这个顺序修复了一个嵌套的集合,得到了最好的结果。一旦问题被分解如下,SQL本身并不困难。
交叉(1:4 3:6)或(1:2 2:3)
https://stackoverflow.com/questions/1521532
复制相似问题