首先要知道一些函数的使用
-
concat(),concat_ws() 字符串的拼接
-
group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator ‘分隔符’])
可以对将要拼接的字段值去重,也可以排序,指定分隔符。若没有指定,默认以逗号分隔。它是有长度限制的,默认为 1024 字节
所以,我们有两种方法解决这个问题:
可以通过修改 MySQL 配置文件 my.cnf ,增加 group_concat_max_len = 102400 #你要的最大长度 。
执行以下任意一个语句。SET GLOBAL group_concat_max_len=102400; 或者 SET SESSION group_concat_max_len=102400;
他们的区别在于,global是全局的,任意打开一个新的会话都会生效,但是注意,已经打开的当前会话并不会生效。而 session 是只会在当前会话生效,其他会话不生效。
共同点是,它们都会在 MySQL 重启之后失效,以配置文件中的配置为准。所以,建议直接修改配置文件。102400 的长度一般也够用了。假设一个id的长度为10个字节,也能拼上一万个id了。
除此之外,使用 group_concat 函数还有一个限制,就是不能同时使用 limit 。
向下递归
利用find_in_set()函数和group_concat()函数实现递归查询
DELIMITER //
CREATE FUNCTION `getChildLst`(rootId varchar(50)) RETURNS varchar(1000) CHARSET utf8
BEGIN
DECLARE sTemp VARCHAR(1000);
DECLARE sTempChd VARCHAR(1000);
SET sTemp = '';
SET sTempChd =rootId;
WHILE sTempChd is not null DO
if sTempChd!=rootId then
SET sTemp = concat(sTemp,',',sTempChd);
end if;
SELECT group_concat(id) INTO sTempChd FROM fl_device_group where parent<>id and FIND_IN_SET(parent,sTempChd)>0;
END WHILE;
RETURN sTemp;
END//
select getChildLst('2')