我们界面上展示树形结构的时候往往会用到懒加载,做懒加载需要知道哪个节点是叶子节点,这样叶子节点就不需要继续往下加载了,这种需求可以通过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)
最终效果: