MySql 利用父id 递归向下/递归向下 查询子节点的方法实例

出处 https://www.jb51.net/article/242090.htm

递归向上

SELECT
	T1.LEVEL,
	T2.*
FROM
	(
		SELECT
			@ids AS _id,
			( SELECT @ids := parent_id FROM sys_role WHERE role_id = _id ) AS pid,
			@l := @l + 1 AS LEVEL
		FROM
			-- 从@ids往上查(从下往上查)
			(SELECT @ids := 4, @l := 0) vars,
			sys_role h
		WHERE
			@ids != 0
	) T1
JOIN sys_role T2 ON T1._id = T2.role_id
ORDER BY
	T1.LEVEL;

递归向下

SELECT
	ID.LEVEL,
	DATA.* 
FROM
	(
	SELECT
		@ids AS _ids,
		( SELECT @ids := GROUP_CONCAT( region_id ) FROM region WHERE FIND_IN_SET(parent_id, @ids ) ) AS cids,
		@l := @l + 1 AS LEVEL 
	FROM
		region,
		( SELECT @ids := 3, @l := 0 ) b 
	WHERE
		@ids IS NOT NULL 
	) ID,
	region DATA 
WHERE
	FIND_IN_SET( DATA.region_id, ID._ids ) 
ORDER BY
	LEVEL

在这里插入图片描述

--创建测试环境
create table t_test(
	id int PRIMARY key,
	parent_id int,
	name varchar(200)
)

insert t_test VALUES(1,null,"中国");
insert t_test VALUES(2,1,"华北");
insert t_test VALUES(3,2,"山西省");
insert t_test VALUES(4,2,"北京");
insert t_test VALUES(5,3,"临汾市");
insert t_test VALUES(6,4,"北京市");
insert t_test VALUES(7,5,"尧都区");
insert t_test VALUES(8,6,"朝阳区");
insert t_test VALUES(9,7,"解放西路");
insert t_test VALUES(10,8,"朝阳北路");

SELECT * FROM t_test;

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值