mysql树形结构返回是否叶子节点

我们界面上展示树形结构的时候往往会用到懒加载,做懒加载需要知道哪个节点是叶子节点,这样叶子节点就不需要继续往下加载了,这种需求可以通过sql实现

先来看下表结构

方式一,通过sql语句直接获取leaf

什么是叶子节点?就是没有哪个pid指向自己的就是叶子节点

第一步,获取所有pid

select distinct pid from department where pid is not null

 第二步,判断是不是叶子节点,就是id not in这些pid,完整语句如下

select *, 
(id not in  (select distinct pid from department where pid is not null)) as leaf
from department

查出的数据

方式二,加一个leaf字段

如果数据比较多,每次加个子查询比较耗时,可以加个leaf字段统一处理下,当然,统一处理后,以后每次新增和删除节点的时候都要维护下这个字段,比如新增时把父节点的leaf置为0,新增节点的leaf是1,删除时判断父节点有没有子节点了,没有就把leaf置为1

下面是统一处理方法

第一步,把所有节点设置为叶子节点

update department set leaf = 1

第二步,找到有子节点的节点,把leaf设置为0,这里面用到了上面相同的技巧,先查出所有pid,然后id in这些pid的,就说明有子节点,需要注意的是sql语句不允许update和where子查询用同一张表,需要把子查询转成子表,然后再select查询pid

update department set leaf = 0 
where id in 
(select pid from (select distinct pid from department where pid is not null) as a)

最终效果:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值