superstarxue630 2023-04-07 17:07 采纳率: 63.6%
浏览 49
已结题

MySQL 递归查询 机构表 查询结果不准

MySQL 递归查询 机构表

用的是这个帖子的方式二 单纯使用sql 不创建函数 实现递归 2.2.1.查询子节点 含自己
机构表cl_org字段如下,orgID是机构编码,orgHA是上级机构编码

img


共计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条查询结果截图:

img

16条查询结果截图:

img

  • 写回答

4条回答 默认 最新

  • 十&年 Java领域新星创作者 2023-04-08 14:35
    关注

    我现在看不到你的数据,但是根据你的描述,大概能猜测到问题,查询用到了GROUP_CONCAT(),该函数默认长度是1024,你按照2.1方式一里面的主意事项 修改一下,再试试

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月10日
  • 已采纳回答 4月10日
  • 创建了问题 4月7日