032.mysql-递归函数 find_in_set编写函数实现子公司的递归查找

需求  找出子公司、子公司的子公司、子公司的子公司的公司 。。。。。

mysql实现递归

 创建测试表

CREATE TABLE `digui_test` (
`org_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '子公司',
`inv_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '母公司'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

插入数据

 

 find_in_set 实现

函数

复制代码
CREATE DEFINER=`root`@`localhost` FUNCTION `getAllChild`(rootId varchar(16380)) RETURNS varchar(16380) CHARSET utf8mb4 COLLATE utf8mb4_general_ci
    DETERMINISTIC
BEGIN 
    DECLARE pTemp VARCHAR(16380);            
    DECLARE cTemp VARCHAR(16380);      -- 节点ID(临时变量)

    SET pTemp = '$';  
    SET cTemp =cast(rootId as CHAR);  -- 把rootId强制转换为字符。

    WHILE cTemp is not null DO  
       SET pTemp = concat(pTemp,',',cTemp);  -- 把所有节点连接成字符串。
       SELECT group_concat(org_id) INTO cTemp FROM test.digui_test   
       WHERE FIND_IN_SET(inv_id,cTemp)>0; 
    END WHILE;  
    RETURN pTemp;  
END
复制代码

 

调用

复制代码
select 
 distinct  org_id
from 
(
    SELECT
        org_id
    FROM 
             test.digui_test  T,
            (SELECT @DATAS := getAllChild ('bx001')) x 
    WHERE find_in_set (org_id, @DATAS)
    )a
复制代码

 

 

 

有坑

 

注意问题:
1). GROUP_CONCAT有个最大长度的限制,超过最大长度就会被截断掉,可以通过下面的语句获得:

 

  SELECT @@global.group_concat_max_len;

 

  show variables like "group_concat_max_len";

 

2).在MySQL配置文件中my.conf或my.ini中添加:

 

  #[mysqld]
  group_concat_max_len=102400

 

3).重启MySQL服务

 

posted @   star521  阅读(482)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示