版權聲明:本文爲博主原創文章,遵循 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