mysql樹形結構遞歸查詢


之前一直用的是Oracle,對於樹形查詢可以使用start with ... connect by 

select * from menu start with id='130000' connect by id = prior parent_id;

 沒錯,這是Oracle所支持的

現在公司用的是mysql,對於這種查詢方式只能通過sql語句實現了

語言都是相通的,何況sql呢

mysql隨沒有自帶的語法支持,不過可以通過創建函數來實現遞歸查詢。

 

 如下圖所示。。。

 

直接上sql語句

create table `nodelist` ( `id` int (11), `nodecontent` varchar (300), `pid` int (11) ); insert into `nodelist` (`id`, `nodecontent`, `pid`) values('1','a',NULL); insert into `nodelist` (`id`, `nodecontent`, `pid`) values('2','b','1'); insert into `nodelist` (`id`, `nodecontent`, `pid`) values('3','c','1'); insert into `nodelist` (`id`, `nodecontent`, `pid`) values('4','d','2'); insert into `nodelist` (`id`, `nodecontent`, `pid`) values('5','e','3'); insert into `nodelist` (`id`, `nodecontent`, `pid`) values('6','f','3'); insert into `nodelist` (`id`, `nodecontent`, `pid`) values('7','g','5'); insert into `nodelist` (`id`, `nodecontent`, `pid`) values('8','h','7'); insert into `nodelist` (`id`, `nodecontent`, `pid`) values('9','i','8'); insert into `nodelist` (`id`, `nodecontent`, `pid`) values('10','j','8');

 

 之后創建一個函數

DROP FUNCTION IF EXISTS `getChild`$$ CREATE DEFINER=`root`@`localhost` FUNCTION `getChild`(rootId INT) RETURNS VARCHAR(1000) CHARSET utf8 BEGIN
        DECLARE ptemp VARCHAR(1000); DECLARE ctemp VARCHAR(1000); SET ptemp = '#'; SET ctemp =CAST(rootId AS CHAR); WHILE ctemp IS NOT NULL DO SET ptemp = CONCAT(ptemp,',',ctemp); SELECT GROUP_CONCAT(id) INTO ctemp FROM nodelist WHERE FIND_IN_SET(pid,ctemp)>0; END WHILE; RETURN ptemp; END$$ DELIMITER ;

OK,查詢可以通過將函數當做一個查詢條件。

SELECT * FROM nodelist WHERE FIND_IN_SET(id, getChild(3))

 

上面難度相對比較大,再補充一個簡單的自連接查詢

SELECT t1.id,t1.nodecontent,t2.nodecontent parentnodecontent FROM nodelist t1
LEFT JOIN nodelist t2
ON t1.pid = t2.id

可以了。

借鑒 https://www.jianshu.com/p/f99665266bb1

里面用到的內置函數 https://baijiahao.baidu.com/s?id=1595349117525189591&wfr=spider&for=pc

你只要能想到的,都有對應的解決方式,幸運的是你該踩得一些坑別人實現給你填好了。


免責聲明!

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



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