组织表: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