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