mysql中没提供现成的递归函数,于是网上找了下,发现几乎全是这类型
CREATE DEFINER=`root`@`%` FUNCTION `getChildLst`(rootId VARCHAR(40)) RETURNS varchar(20000) CHARSET utf8
READS SQL DATA
BEGIN
DECLARE sTemp VARCHAR(20000);
DECLARE sTempChd VARCHAR(20000);
SET sTemp = '$';
SET sTempChd = rootId;
WHILE sTempChd is not null DO
SET sTemp = concat(sTemp,',',sTempChd);
SELECT group_concat(unit_id) INTO sTempChd FROM base_unit where FIND_IN_SET(parent_unitid,sTempChd) > 0;
END WHILE;
RETURN sTemp;
END
查询结果sql
select * from base_unit u where FIND_IN_SET(unit_id,getChildLst('2f566d9b-0b64-4bba-82b2-88e134efcd52')) ;
刚开始测试时,发现的确达到了我要的目的,也就不注意了。但是用了一段时间后,测试MM说,数据不齐全。赶紧进行跟踪,最终发现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(或者其他客户端)重新连接数据库,再次查询,这次数据齐全了