MySQL中使用find_in_set和group_concat组合递归函数

mysql中没提供现成的递归函数,于是网上找了找,自己改了改

CREATE FUNCTION `getChildList`(rootId INT)
RETURNS varchar(1000) 
BEGIN
    DECLARE sTemp VARCHAR(1000);
    DECLARE sTempChd VARCHAR(1000);
    SET sTemp = '$';
    SET sTempChd =cast(rootId as CHAR);
    WHILE sTempChd is not null DO
        SET sTemp = concat(sTemp,',',sTempChd);
        SELECT group_concat(ID) INTO sTempChd FROM  pt_department where FIND_IN_SET(AGENCY_ID,sTempChd)>0;
    END WHILE;
    RETURN sTemp; 
END

刚开始测试时,发现的确达到了我要的目的,也就不注意了。但是用了一段时间后,测试时发现,数据不齐全。赶紧进行跟踪,最终发现group_concat里面的结果居然是不完整的。网上查了下为何group_concat数据不全,也不报错。原来group_concat是有长度限制的。解决方法是修改group_concat的长度。

-- 查看 group_concat_max_len 
show variables like 'group_concat_max_len'

如果不方便重启数据库,那可以

-- SET GLOBAL group_concat_max_len = 400000

但是这处理,如果数据库重启了,它又会回复会原值。所以也可以在配置文件修改my.ini

在[mysqld]下新增配置:group_concat_max_len = 102400

处理好后,端口navicat(或者其他客户端)重新连接数据库,再次查询,这次数据齐全了

你可能感兴趣的:(MySQL中使用find_in_set和group_concat组合递归函数)