MySql8 WITH RECURSIVE遞歸查詢父子集的方法
背景
開發(fā)過程中遇到類似評論的功能是,需要時用查詢所有評論的子集。不同數(shù)據(jù)庫中實現(xiàn)方式也不同,本文使用Mysql數(shù)據(jù)庫,版本為8.0
- Oracle數(shù)據(jù)庫中可使用START [Param] CONNECT BY PRIOR
- Mysql 中需要使用 WITH RECURSIVE
需求
找到name為張三的孩子和孫子,pid為當(dāng)前記錄的父id,如張三兒子的pid為張三的id,以此類推。

引入
計算1到100的累加的結(jié)果。 WITH RECURSIVE t(n) AS ( //t為我們結(jié)果表,n為字段,可以只指定表明不指定字段 VALUES (1) //遞歸的開始,此時可理解為t表字段n只有一條記錄 1 UNION ALL SELECT n+1 FROM t WHERE n < 100 /*這里產(chǎn)生的結(jié)果為 2 ,此時t表的字段n有兩條記錄分別為1,2 * 3 * ... * 100 */ ) SELECT sum(n) FROM t; //對字段n求和
父求子
WITH RECURSIVE temp AS ( // 將結(jié)果表命名為temp SELECT * FROM resource r WHERE r.name ='張三' //查詢出父id這條記錄,此時這條記錄已存在temp表中 ,如圖1-1 UNION ALL /*這時要注意,下面這條sql是獲取的期望結(jié)果中的后兩條記錄(不包含第一條) *注意where后的條件,我們使用temp表中的唯一一條記錄的id關(guān)聯(lián)resource表中的pid *僅當(dāng)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

到此這篇關(guān)于MySql8 遞歸查詢父子集的方法的文章就介紹到這了,更多相關(guān)MySql8 遞歸查詢父子集內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL數(shù)據(jù)庫遷移到Oracle數(shù)據(jù)庫的完整步驟記錄
在研發(fā)過程中可能會用到將表數(shù)據(jù)庫中的表結(jié)構(gòu)及數(shù)據(jù)遷移到另外一種數(shù)據(jù)庫中,比如說從mysql中遷移到oracle中,這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫遷移到Oracle數(shù)據(jù)庫的完整步驟,需要的朋友可以參考下2024-06-06
詳解MySQL恢復(fù)psc文件記錄數(shù)為0的解決方案
這篇文章主要介紹了詳解MySQL恢復(fù)psc文件記錄數(shù)為0的解決方案,遇到這個問題的朋友,可以看一下。2016-11-11
mysql數(shù)據(jù)庫修改添加Date格式列的方法
這篇文章主要介紹了關(guān)于mysql數(shù)據(jù)庫如何修改添加Date格式的列 ,需要的朋友可以參考下2014-07-07
MySQL?原理優(yōu)化之Group?By的優(yōu)化技巧
這篇文章主要介紹了MySQL?原理優(yōu)化之Group?By的優(yōu)化技巧,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-08-08

