MySql8 WITH RECURSIVE递归查询父子集的方法

吾爱主题 阅读:185 2024-04-02 07:58:16 评论:0

背景

开发过程中遇到类似评论的功能是,需要时用查询所有评论的子集。不同数据库中实现方式也不同,本文使用mysql数据库,版本为8.0

  • oracle数据库中可使用start [param] connect by prior
  • mysql 中需要使用 with recursive

需求

找到name为张三的孩子和孙子,pid为当前记录的父id,如张三儿子的pid为张三的id,以此类推。

引入

?
1 2 3 4 5 6 7 8 9 10 11 12 计算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求和

父求子

?
1 2 3 4 5 6 7 8 9 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

子查父

?
1 2 3 4 5 6 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 递归查询父子集内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/dylan95/article/details/105739504

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容