zoukankan      html  css  js  c++  java
  • 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服务

  • 相关阅读:
    Android中的Intent详解
    Android数据保存之文件保存
    Android数据保存之SharedPreference
    Activity的生命周期函数
    Android主线程的消息系统(HandlerLooper)
    Activity生命周期
    Android内存优化之磁盘缓存
    Android内存优化之内存缓存
    Android Bitmap那些事之如何优化内存
    Bitmap那些事之内存占用计算和加载注意事项
  • 原文地址:https://www.cnblogs.com/star521/p/14608958.html
Copyright © 2011-2022 走看看