Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 修复损坏的嵌套集_Php_Mysql - Fatal编程技术网

Php 修复损坏的嵌套集

Php 修复损坏的嵌套集,php,mysql,Php,Mysql,我必须通过脚本或sql修复损坏的嵌套集链。该表包含左值列和右值列,但没有父id列。 我能够计算嵌套集中每个节点的级别。左右值之间存在间隙。计算水平的结构是有效的。 有人知道通过SQL来弥补差距的解决方案吗?MySQL 这些建议都不适合我的问题,但谢谢你的参与 我为自己想出了一个解决方案: 1.第一步计算父ID并转换为邻接列表 2.使用Joe Celko的方法将邻接列表转换为嵌套集 3.更新旧的左和右值我只需根据您拥有的左和右值生成一个父id列,然后重新生成左和右值 如果不想修改当前表,甚至可以在

我必须通过脚本或sql修复损坏的嵌套集链。该表包含左值列和右值列,但没有父id列。 我能够计算嵌套集中每个节点的级别。左右值之间存在间隙。计算水平的结构是有效的。 有人知道通过SQL来弥补差距的解决方案吗?MySQL

这些建议都不适合我的问题,但谢谢你的参与

我为自己想出了一个解决方案: 1.第一步计算父ID并转换为邻接列表 2.使用Joe Celko的方法将邻接列表转换为嵌套集
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 lftCREATE 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