• 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服务

  • 相关阅读:
    js根据年月获取当月最后一天
    skywalking 执行流程 日志放在哪里 MySQL或者ES
    SpringCloud微服务间安全调用实现(SpringSecurity+Oauth2+Jwt)
    内存泄露和内存溢出的区别
    Mybatis的执行流程
    Spring如何解决循环依赖
    Spring事务在哪几种情况下会失效?
    Spring Boot 中application.yml与bootstrap.yml的区别
    Nacos执行流程
    Gateway 如何解决跨域问题
  • 原文地址:https://www.cnblogs.com/star521/p/14608958.html
Copyright © 2020-2023  润新知