1. 程式人生 > 資料庫 >MySql8 WITH RECURSIVE遞迴查詢父子集的方法

MySql8 WITH RECURSIVE遞迴查詢父子集的方法

背景

開發過程中遇到類似評論的功能是,需要時用查詢所有評論的子集。不同資料庫中實現方式也不同,本文使用Mysql資料庫,版本為8.0

  • Oracle資料庫中可使用START [Param] CONNECT BY PRIOR
  • Mysql 中需要使用 WITH RECURSIVE

需求

找到name為張三的孩子和孫子,pid為當前記錄的父id,如張三兒子的pid為張三的id,以此類推。

在這裡插入圖片描述

引入

計算1到100的累加的結果。
WITH RECURSIVE t(n) AS ( //t為我們結果表,n為欄位,可以只指定表明不指定欄位
  VALUES (1) //遞迴的開始,此時可理解為t表字段n只有一條記錄 1
 UNION ALL
  SELECT n+1 FROM t WHERE n < 100   
  /*這裡產生的結果為 2 ,此時t表的欄位n有兩條記錄分別為1,2
  *				 3
  *         ...
  *         100
  */													  
)
SELECT sum(n) FROM t; //對欄位n求和

父求子

WITH RECURSIVE temp AS ( // 將結果表命名為temp
	SELECT * FROM resource r WHERE r.name ='張三' //查詢出父id這條記錄,此時這條記錄已存在temp表中 ,如圖1-1
	UNION ALL
	/*這時要注意,下面這條sql是獲取的期望結果中的後兩條記錄(不包含第一條)
	*注意where後的條件,我們使用temp表中的唯一一條記錄的id關聯resource表中的pid
	*僅當temp第一條記錄匹配不到resource表中的pid時才會對temp的第二條記錄id進行匹配
	*/
	SELECT r.* FROM resource r,temp t WHERE t.id = r.pid
)select * from temp

在這裡插入圖片描述

子查父

WITH recursive temp AS (
	SELECT * FROM resource r WHERE r.name ='張三孫子'
	UNION ALL
	//已知的是子集,所以我們需要通過temp的pid匹配resource的id
	SELECT r.* FROM resource r,temp t WHERE t.pid = r.id
)select * from temp

在這裡插入圖片描述

到此這篇關於MySql8 遞迴查詢父子集的方法的文章就介紹到這了,更多相關MySql8 遞迴查詢父子集內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!