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 @ 2021-04-02 01:29  star521  阅读(453)  评论(0编辑  收藏  举报