背景
开发过程中遇到类似评论的功能是,需要时用查询所有评论的子集。不同数据库中实现方式也不同,本文使用Mysql数据库,版本为8.0<br /> Oracle数据库中可使用START [Param] CONNECT BY PRIOR<br /> Mysql 中需要使用 WITH RECURSIVE
需求
找到name为张三的孩子和孙子,pid为当前记录的父id,如张三儿子的pid为张三的id,以此类推。<br />
引入
/
计算1到100的累加的结果。WITH RECURSIVE t(n) AS ( //t为我们结果表,n为字段,可以只指定表明不指定字段VALUES (1) //递归的开始,此时可理解为t表字段n只有一条记录 1UNION ALLSELECT n+1 FROM t WHERE n < 100/*这里产生的结果为 2 ,此时t表的字段n有两条记录分别为1,2* 3* ...* 100*/)SELECT sum(n) FROM t; //对字段n求和
父求子
WITH RECURSIVE temp AS ( // 将结果表命名为tempSELECT * FROM resource r WHERE r.name ='张三' //查询出父id这条记录,此时这条记录已存在temp表中 ,如图1-1UNION 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的idSELECT r.* FROM resource r,temp t WHERE t.pid = r.id)select * from temp
![[MySql 8]WITH RECURSIVE递归查询父子集 - 图2](/uploads/projects/u12428923@ibeo27/c3a3c707798a7f62fa8f9f92b7a8da06.png)
