天天看點

mysql遞歸查詢方法|mysql遞歸查詢遇到的坑,教你們解決辦法

1.前言

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

遇到問題如圖:

mysql遞歸查詢方法|mysql遞歸查詢遇到的坑,教你們解決辦法

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

2.踩坑介紹

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

我就不一一列舉啦,但是他們可能也是轉載其他人的,其中遇到問題,他們并沒有提前向大家說明或者他們自己也沒有試過,小編就拿其中的一個方法試了一下,就遇到了如開頭所說的一堆問題,是以大家在使用mysql遞歸方法之前一定要把這篇文章看完,因為你不看的話,等一下你一執行遞歸查詢語句,一試一個錯

3.埋坑教程

①遞歸子節點

咱們先看遞歸所有的子節點,首先必須得建立輔助函數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裡面的表名,當然小編這裡隻是建議。

mysql遞歸查詢方法|mysql遞歸查詢遇到的坑,教你們解決辦法

②遞歸父節點

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

咱們先建立輔助函數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可改可不改,你怎麼高興怎麼來
mysql遞歸查詢方法|mysql遞歸查詢遇到的坑,教你們解決辦法

4.總結

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

繼續閱讀