使用左右值编码来存储无限分级树形结构 (三) -- 应用篇


应用
某个节点到底有多少子孙节点?
子孙总数
=(父节点的右值 - 父节点的左值 -1 /2

以节点 食品 举例,其子孙总数=( 11-2-1 / 2 4


如何判断某一节点下有没有子节点?
该节点左值-1等于其右值时,其下没有子节点。


检索某一父节点的所有子节点?
假定我们要 对节点“食品”及其子孙节点进行先序遍历 的列表,只需使用如下一条 sql 语句:

SELECT * FROM `tree` WHERE `left_node` BETWEEN 2 AND 11 ORDER BY `left_node` ASC



如何取得父类?
SELECT * FROM `tree` WHERE `left_node`<$left_node AND `right_node`>$right_node


检索之后如何列表?

当左值 +1== 右值时,该节点没有子节点,则下一节点不为其子节点

若下一节点的左值 == 上一节点右值 +1 ,则 2 个节点是同级关系

若下一节点的左值 == 上一节点的左值 +1 时,则第 2 个节点应是第一个节点的子节点

若下一节点的左值 - 上一节点的右值 >1 时,则下一节点比上一节点高
(下一节点的左值 - 上一节点的右值)



在某一父节点下添加一个子节点?
1. 要求该子节点为该父节点下排序第一的节点,则$left_node =父节点left_node+1, $right_node = $left_node+1;
2. 要求该节点位于父节点下一个子节点A后面,则$left_node = 节点Aright_node+1, $right_node = $left_node+1;
3. 要求该节点是位于父节点下排序最后一位的节点,则$left_node =父节点right_node, $right_node = $left_node+1;

Sql:
UPDATE `tree` SET `right_node`=`right_node`+2 WHERE `right_node`>=$left_node
UPDATE `tree` SET `left_node`=`left_node`+2 WHERE `left_node`>=$left_node
INSERT INTO `tree` (`name` , `left_node` , `right_node`) VALUES
(`
名字` , $left_node , $right_node)



移动节点,包括其子节点至节点A下?
设该节点左值$left_node ,右值$right_node
其子节点的数目为$count = ($right_node - $left_node -1 )/2 ,节点A左值为$A_left_node ,

UPDATE `tree` SET `right_node`=`right_node`-$right_node-$left_node-1 WHERE `right_node`>$right_node AND `right_node`<$A_left_node
UPDATE `tree` SET `left_node`=`left_node`-$right_node-$left_node-1 WHERE `left_node`>$right_node AND `left_node`<=$A_left_node
UPDATE `tree` SET `left_node`=`left_node`+$A_left_node-$right_node , `right_node`=`right_node`+$A_left_node-$right_node WHERE `left_node`>=$left_node
AND `right_node`<=$right_node




删除所有子节点?
DELETE FROM `tree` WHERE `left_node`>父节点的左值 AND `right_node`>父节点的右值


删除一个节点及其子节点?
在上例中的<>号后面各加一个=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值