1.前言
大家在用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裡面的表名,當然小編這裡隻是建議。
②遞歸父節點
那麼接下來的遞歸所有的父節點,也是同樣的道理,
咱們先建立輔助函數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有更好的方法以及自己的獨特見解,歡迎在留言處留言或者留下你的文章連結,咱們一起學習一起進步