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%';
2.2)、修改character_set_database 的value,执行如下sql:
alter database character set latin1;
对于递归函数 getChildId_bas_basic_tree 设置为gbk,以为gbk查询速率比uft8快。