1、先创建函数​getChildId_bas_basic_tree​  如下:

CREATE  FUNCTION `getChildId_bas_basic_tree`(rootId int) RETURNS varchar(21844) CHARSET gbk
BEGIN
DECLARE pTemp Varchar(21844);
DECLARE cTemp Varchar(21844); -- 节点ID(临时变量)

SET pTemp = '';
SET cTemp =cast(rootId as CHAR); -- 把rootId强制转换为字符。

WHILE cTemp is not null DO
SET pTemp = concat(pTemp,',',cTemp); -- 把所有节点连接成字符串。
SELECT group_concat(childid) INTO cTemp FROM ranks
WHERE FIND_IN_SET(parentid,cTemp)>0;
END WHILE;

RETURN pTemp;
END



2、调用函数:

SELECT
childid,parentId
FROM
ranks T,
(SELECT @DATAS := getChildId_bas_basic_tree (1200)) a
WHERE find_in_set (childid, @DATAS);


 ps​:在调用  ​group_concat​  函数时出现, ​“data too long for column 'xxx' ”

解决方法步骤:

第一步:​设置 group_concat_max_len  值​:

1.1)、查看

show variables like “group_concat_max_len”

1.2)、设置长度,GLOBAL是全局,SESSION指的是当前会话,重启会无效,所以要结合第三步

SET GLOBAL group_concat_max_len=10240;

SET SESSION group_concat_max_len=10240;

1.3)、配置中设置 my.cnf :

group_concat_max_len = 10240


如果还是出现: “data too long for column 'xxx' ” 错误

第二步:

2.1)、查询mysql的字符集:

show VARIABLES like 'character%';

mysql 无限递归出现 data too long for column

2.2)、修改character_set_database 的value,执行如下sql:

alter database character set latin1;


 对于递归函数  ​getChildId_bas_basic_tree ​设置为​gbk​,以为​gbk​查询速率比​uft8​快。

mysql 无限递归出现 data too long for column