MySQL 递归查询 机构表
用的是这个帖子的方式二 单纯使用sql 不创建函数 实现递归 2.2.1.查询子节点 含自己
机构表cl_org字段如下,orgID是机构编码,orgHA是上级机构编码
共计131条数据,确定都是编号 1_1 机构及其下属机构
但是根据以下语句查出来的只有128条,少了三条数据,三条数据都在同一个三级机构下
SELECT T2.level_, T3.* FROM( SELECT @codes as _ids,
( SELECT @codes := GROUP_CONCAT(orgID) FROM cl_org WHERE FIND_IN_SET(orgHA, @codes) ) as T1,
@l := @l+1 as level_ FROM cl_org, (SELECT @codes :=1_1, @l := 0 ) T4 WHERE @codes IS NOT NULL ) T2, cl_org T3
WHERE FIND_IN_SET(T3.orgID, T2._ids) ORDER BY level_, orgID;
2_1是二级机构,3_1是它下属三级机构,以下语句查询2_1的所有下属机构(含本身)中上级机构是3_1的机构,查询结果12条。
SELECT T2.level_, T3.* FROM( SELECT @codes as _ids,
( SELECT @codes := GROUP_CONCAT(orgID) FROM cl_org WHERE FIND_IN_SET(orgHA, @codes) ) as T1,
@l := @l+1 as level_ FROM cl_org, (SELECT @codes :=2_1, @l := 0 ) T4 WHERE @codes IS NOT NULL ) T2, cl_org T3
WHERE FIND_IN_SET(T3.orgID, T2._ids) and T3.orgHA=3_1 ORDER BY level_, orgID;
直接查3_1的下属机构(含本身),可以查到16条。
SELECT T2.level_, T3.* FROM( SELECT @codes as _ids,
( SELECT @codes := GROUP_CONCAT(orgID) FROM cl_org WHERE FIND_IN_SET(orgHA, @codes) ) as T1,
@l := @l+1 as level_ FROM cl_org, (SELECT @codes :=3_1 , @l := 0 ) T4 WHERE @codes IS NOT NULL ) T2, cl_org T3
WHERE FIND_IN_SET(T3.orgID, T2._ids) ORDER BY level_, orgID;
按理说,上面第一条语句的查询结果,会比第二条语句只少一条(3_1本身),但实际查询结果,却少了3条四级机构的数据
为了看的明白,把机构编码替换了一下。
12条查询结果截图:
16条查询结果截图: