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快。