Php 修复损坏的嵌套集
我必须通过脚本或sql修复损坏的嵌套集链。该表包含左值列和右值列,但没有父id列。 我能够计算嵌套集中每个节点的级别。左右值之间存在间隙。计算水平的结构是有效的。 有人知道通过SQL来弥补差距的解决方案吗?MySQL 这些建议都不适合我的问题,但谢谢你的参与 我为自己想出了一个解决方案: 1.第一步计算父ID并转换为邻接列表 2.使用Joe Celko的方法将邻接列表转换为嵌套集Php 修复损坏的嵌套集,php,mysql,Php,Mysql,我必须通过脚本或sql修复损坏的嵌套集链。该表包含左值列和右值列,但没有父id列。 我能够计算嵌套集中每个节点的级别。左右值之间存在间隙。计算水平的结构是有效的。 有人知道通过SQL来弥补差距的解决方案吗?MySQL 这些建议都不适合我的问题,但谢谢你的参与 我为自己想出了一个解决方案: 1.第一步计算父ID并转换为邻接列表 2.使用Joe Celko的方法将邻接列表转换为嵌套集 3.更新旧的左和右值我只需根据您拥有的左和右值生成一个父id列,然后重新生成左和右值 如果不想修改当前表,甚至可以在
3.更新旧的左和右值我只需根据您拥有的左和右值生成一个父id列,然后重新生成左和右值
如果不想修改当前表,甚至可以在临时表中进行修改。节点c的每个祖先都有一个较小的左值和较大的右值。直接父p是祖先集合中左值最大的一个 例如
嵌套集中有4或5种不同的损坏情况,如果按照正确的顺序执行,这些情况是完全可以修复的。通过一个简单的触发器,检查左侧是否大于等于右侧,可以很容易地防止混乱。按照这个顺序修复嵌套集,我得到了最好的结果。一旦问题被分解如下,SQL本身就不难了 交叉1:4 3:6或1:2 2:3 低于/超过1:4 1:3或1:4 2:4 差距2:3 5:6 1:7或2:4 5:6 1:7 纠缠2:14:2或1:1
所以你想在左/右的邻接列表中额外存储父id?我必须同意-没有父id你就完蛋了。或者至少这是我处理相同问题后发现的。我通过使用以下SQL解决了在没有父列的情况下计算父id的问题:SELECT a.id,如果B.id为NULL,则1,B.id作为父级从页面作为左外部连接页面作为B在B.tree\u lft=选择MAXC.tree\u lft从页面作为C,其中A.tree\u lft>C.tree\u lft和A.tree\u lft
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