MySQL自定義函數遞歸查詢父節點和子節點

#說明: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

相關文章
相關標籤/搜索