MySql遞歸查詢

原文鏈接:https://blog.csdn.net/qq_27471405/article/details/83008896

版權聲明:本文爲博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/qq_27471405/article/details/83008896


1.前言

大家在用mysql遞歸查詢的時候,肯定或多或少的會碰到一些問題,像小編就遇到了天大的坑(如下圖),於是自己踩了坑,我得想辦法把它鋪一鋪吖,避免大家也同時遇到這樣的問題。讓技術人能夠快速的解決問題。

遇到問題如圖:

 

相信很多人都用不慣mysql,小編也是,oracle的遞歸查詢很簡單。就一句sql就可以搞定,還有不清楚或者突然忘記需要溫習的小夥伴們,大家可以看小編髮的以前的關於oracle遞歸查詢的方法,戳這裏:【oracle遞歸查詢方法介紹】

2.踩坑介紹

mysql遞歸查詢,不會吖,大家可以網上搜索遞歸查詢的方法,這一查很多,

比如:https://www.cnblogs.com/xiaoxi/p/5942805.html 或者:https://blog.csdn.net/jian_c/article/details/79854491等等,我就不一一列舉啦,但是他們可能也是轉載其他人的,其中遇到問題,他們並沒有提前向大家說明或者他們自己也沒有試過,小編就拿其中的一個方法試了一下,就遇到了如開頭所說的一堆問題,所以大家在使用mysql遞歸方法之前一定要把這篇文章看完,因爲你不看的話,等一下你一執行遞歸查詢語句,一試一個錯

 

3.埋坑教程

我就以這篇文章爲例了:https://blog.csdn.net/jian_c/article/details/79854491

①遞歸子節點

咱們先看遞歸所有的子節點,首先必須得創建輔助函數getChildList(),如下代碼

 
CREATE FUNCTION `getChildList`(rootId INT)
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  treeNodes where FIND_IN_SET(pid,sTempChd)>0;
    END WHILE;
    RETURN sTemp; 
END
 
上面這個輔助函數,你不要盲目的全部複製過去,然後一執行就肯定會報錯的,一定要注意裏面的字段和你創建的表的對應關係,這點也就是和oracle區別最大的地方

看我下面的截圖標記的序號分別要注意的要點,

1:你創建的表的主鍵id,

2:你創建的表名,

3:你創建的表的表示上級的字段,

4:這裏可以改可以不改,因爲按照mysql這樣的情況,如果你的數據庫可能將來有多張表會用到遞歸查詢的話,這裏最好換個名字,比如getchildListTablename,tablename可以換成你2裏面的表名,當然小編這裏只是建議。

 

②遞歸父節點

那麼接下來的遞歸所有的父節點,也是同樣的道理,

咱們先創建輔助函數getParList(),

 
CREATE FUNCTION `getParList`(rootId INT)
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(pid) INTO sTempPar FROM treenodes where pid<>id and FIND_IN_SET(id,sTempPar)>0; 
    END WHILE; 
 
RETURN sTemp; 
END
 
 

這個也是一樣,不要盲目的複製過去執行,要跟你的表一一對應,我已經幫大家標記好了,將1到5的數據,換成你創建的表名主鍵,表名和表示上級的字段,6可改可不改,你怎麼高興怎麼來

 

4.總結

上面這些,就是小編在用mysql遞歸查詢遇到的坑,如果你還沒有遇到,恭喜你,看完這篇文章可以避免踩坑了,但是記得點個贊吖。哈哈哈哈哈。如果大家對於mysql有更好的方法以及自己的獨特見解,歡迎在留言處留言或者留下你的文章鏈接,咱們一起學習一起進步

 

參考文章

https://blog.csdn.net/jian_c/article/details/79854491

https://www.cnblogs.com/xiaoxi/p/5942805.html

感謝原作者的分享,讓技術人能夠更快的解決問題
————————————————
版權聲明:本文爲CSDN博主「小小魚兒小小林」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_27471405/article/details/83008896

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章