需求 找出子公司、子公司的子公司、子公司的子公司的公司 。。。。。
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服务