#說明:area_id表示當前節點,are_area_id表示父節點mysql
#mysql向下遞歸查詢子節點
CREATE FUNCTION getChildListById(id varchar(32))
RETURNS varchar(4000)
BEGIN
DECLARE str varchar(4000);
DECLARE cid varchar(4000);
DECLARE area_id_str varchar(8000);
select area_id into cid from area where area_id = id;
#GROUP_CONCAT將某一字段的值按指定的字符進行累加,系統默認的分隔符是逗號,默承認以累加的字符長度爲1024字節
SET GLOBAL group_concat_max_len=102400;
SET SESSION group_concat_max_len=102400;
SET str = '';
SET area_id_str = null;
WHILE cid is not null DO
SET str = concat(str, ',', cid);
SELECT group_concat(area_id) INTO cid FROM area where FIND_IN_SET(are_area_id, cid) > 0;
END WHILE;
select group_concat(area_id) into area_id_str from area where find_in_set(area_id, str);
RETURN area_id_str;
END;sql
#mysql向上遞歸查詢子節點
CREATE FUNCTION getParentListById(id varchar(32))
RETURNS varchar(4000)
BEGIN
DECLARE str varchar(4000);
DECLARE cid varchar(4000);
DECLARE area_id_str varchar(8000);
select area_id into cid from area where area_id = id;
#GROUP_CONCAT將某一字段的值按指定的字符進行累加,系統默認的分隔符是逗號,默承認以累加的字符長度爲1024字節
SET GLOBAL group_concat_max_len=102400;
SET SESSION group_concat_max_len=102400;
SET str = '';
SET area_id_str = null;
WHILE cid is not null DO
SET str = concat(str, ',', cid);
SELECT group_concat(are_area_id) INTO cid FROM area where FIND_IN_SET(area_id, cid) > 0;
END WHILE;
select group_concat(area_id) into area_id_str from area where find_in_set(area_id, str);
RETURN area_id_str;
END;函數
函數查詢出來的結果是節點id以逗號分隔的字符串(如:a,b,c...形式)優化
要查詢列表能夠再使用:遞歸
select * from area t where FIND_IN_SET(t.area_id,getParentListById('510100'));ci
但這種方式查詢效率很是低下,能夠優化字符串
select * from area t,(select getParentListById('510100') id) a where FIND_IN_SET(t.area_id,a.id);get