MySQL遞歸查詢父子節點


1.表結構

CREATE TABLE folder(

id BIGINT(20) NOT NULL,

parent_id BIGINT(20) DEFAULT NULL,

PRIMARY KEY id

);

2.根據傳入id查詢所有子節點及其的id

創建函數:

CREATE FUNCTION `getParList`(rootId BIGINT)
RETURNS varchar(1000) 
BEGIN
    DECLARE sTemp VARCHAR(1000);
    DECLARE sTempPar VARCHAR(1000); 
    SET sTemp = ''; 
    SET sTempPar =rootId; 
 
    #循環遞歸
    WHILE sTempPar is not null DO 
        #判斷是否是第一個,不加的話第一個會為空
        IF sTemp != '' THEN
            SET sTemp = concat(sTemp,',',sTempPar);
        ELSE
            SET sTemp = sTempPar;
        END IF;
        SET sTemp = concat(sTemp,',',sTempPar); 
        SELECT group_concat(parent_id) INTO sTempPar FROM folder where parent_id<>id and FIND_IN_SET(id,sTempPar)>0; 
    END WHILE; 
 
RETURN sTemp; 
END

調用:

select id
from folder
where FIND_IN_SET(id,getChildList(2))

3.根據傳入id查詢所有父節點及其的id

創建函數:

CREATE FUNCTION `getChildList`(rootId BIGINT)
RETURNS varchar(1000) 
 
BEGIN
    DECLARE sTemp VARCHAR(1000);
    DECLARE sTempChd VARCHAR(1000);
 
    SET sTemp = '$';
    SET sTempChd =cast(rootId as CHAR);
 
    WHILE sTempChd is not null DO
        SET sTemp = concat(sTemp,',',sTempChd);
        SELECT group_concat(id) INTO sTempChd FROM  folder where FIND_IN_SET(parent_id,sTempChd)>0;
    END WHILE;
    RETURN sTemp; 
END

調用:

select id
from folder
where FIND_IN_SET(id,getParList(10))









This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its de 錯誤解決辦法

 

這是我們開啟了bin-log, 我們就必須指定我們的函數是否是
1 DETERMINISTIC 不確定的
2 NO SQL 沒有SQl語句,當然也不會修改數據
3 READS SQL DATA 只是讀取數據,當然也不會修改數據
4 MODIFIES SQL DATA 要修改數據
5 CONTAINS SQL 包含了SQL語句

其中在function里面,只有 DETERMINISTIC, NO SQL 和 READS SQL DATA 被支持。如果我們開啟了 bin-log, 我們就必須為我們的function指定一個參數。


在MySQL中創建函數時出現這種錯誤的解決方法:
set global log_bin_trust_function_creators=TRUE;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM