表结构:
三个字段如图所示,目标是获取每条数据的根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进行展示,即我们所需要的值