使用变量 @变量名 实现简单递归查询

组织表:ORG(ORG_ID,PARENT_ID,...)。

目的:查询当前组织所有上级(祖宗)组织。

新SQL实现:

该方式也可以改成实现获取所有子孙组织。

SELECT
	T2.* 
FROM
	(
	SELECT
		@orgIds AS orgIds,
		@orgL := @orgL + 1 AS level_,
		-- 		2.每次循环,做一次该查询(查询当前@orgIds中所有id的父id),更新@orgIds的值
		( SELECT @orgIds := GROUP_CONCAT( PARENT_ID ) AS orgIds FROM ORG WHERE FIND_IN_SET( ORG_ID, @orgIds ) ) 
	FROM
		sjzl_organization,-- 作用相当于,该表有多少行,循环多少次
		-- 		1.仅做变量@orgIds、@orgL初始化
		( SELECT @orgIds := '5ade5ff0de2406d5bb003bea72f9a937' AS orgIds, @orgL := 0 ) T3 
	WHERE
		@orgIds IS NOT NULL 
	) T1,-- T1包含当前组织及所有祖宗组织的 id和级别
	ORG T2 
WHERE
	FIND_IN_SET( T2.ORG_ID, T1.orgIds ) 
	ORDER BY-- 组织大级别大
	T1.level_ DESC

旧SQl实现:

有问题,该方式内仅对ORG T3的记录做一次遍历,即当前@orgId发生改变后,只能影响后续记录;已遍历记录若符合更改后@orgId仍不会进入结果集

SELECT
	T2.* 
FROM
	(
-- 		1.当前组织id,设置变量@id,递归入口、依据;@l组织级别,组织小级别低
		( SELECT @orgId := 'idStr' AS orgId, @l := 0 AS level_ ) UNION ALL
-- 		2.变量@id不断变化,使得查询条件也一直变,达到递归效果;@l不断+1,级别变高
		( SELECT @orgId := PARENT_ID, @l := @l + 1 FROM ORG T3 WHERE ORG_ID = @orgId ) 
	) AS T1,-- T1包含当前组织及所有祖宗组织的 id和级别
	ORG AS T2 
WHERE
	T1.orgId = T2.ORG_ID 
ORDER BY
-- 组织大级别大
	T1.level_ DESC

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值