数据库子父结构表,树状结构数据进行递归查询

表结构:
在这里插入图片描述
三个字段如图所示,目标是获取每条数据的根id(父id为0的数据根id就是自己的id,否则一直根据父id去查找一直找到父id为0的数据,此数据的id就是根id)

业务中实际的解决办法:

新加一个字段进行存储,例如加个字段gen_id。
先执行
update demo_table set gen_id=id where parent_id=0
再反复执行
update demo_table a,(select id,gen_id from demo_table where gen_id is not null) b 
set a.gen_id=b.gen_id
where a.gen_id is null and a.parent_id =b.id;
直到gen_id都不为空

在这里插入图片描述
执行后可见表以存储根节点id

另一种解决方法:递归查询(效率太低)

mysql:mysql递归用法资料
执行sql

with RECURSIVE dg AS(#这是递归查询的开始,创建了一个名为dg 的递归表
	select *,id head_id from demo_table where parent_id=0#递归表的初始数据
	union all#每次递归进行合并
	select into_dg.*,dg.head_id from demo_table into_dg inner join dg on into_dg.parent_id=dg.id#每次递归被合并进bg的数据
)
SELECT * from dg

效果为:
在这里插入图片描述

oracle:oracle递归用法资料(需要搭配CONNECT_BY_ROOT函数可以实现本次要实现的查询根节点需求)
执行sql

select d.*,CONNECT_BY_ROOT d.id head_id,LEVEL from demo_table d
connect by PRIOR id=parent_id 
start with  parent_id = 0

在这里插入图片描述
其中LEVEL是层次,CONNECT_BY_ROOT d.id是将根节点的id进行展示,即我们所需要的值

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

翎墨袅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值