Mysql递归查询

递归查询只支持mysql8.x以上

列如现在有一个这样Mysql评论表(comments)

Id

reply_to_comment_Id

main_comment_id

message

author

1

null

null

主评论

李四

2

1

1

子评论

张三

3

2

1

子子评论

老王

4

null

null

我也是主评论

张七

当我想查询某个主评论的所有子评论时

查询

  • 使用连表查询

    select * 
    from comments c1 
    left join comments c2 on c1.id = c2.main_comment_id 
    where c1.id = #{id}

  • 递归查询

    with recursive t as ( 
        select * from comments where id = #{id}
        #将下面所有查询可重复合并
        union all 
        #调用自定义递归方法名‘t’查询 
        select * 
        from comments 
        join t on t.id = comments.main_comment_id
    )
    #查询递归方法
    select * from t

相比连表查询 递归查询更加灵

union all为重复合并查询语句

union 为不重复合并查询语句

将union all下查询语句(select * from comments join t on t.id = comments.main_comment_id)

查询到的表 内连

union all 上查询语句(select * from comments where id = #{id})

查询到的表

详解

当调用select * from comments where id = #{id}语句后({#id} = 1) 会查询出:

Id

reply_to_comment_Id

main_comment_id

message

author

1

null

null

主评论

李四

( select * from comments join t on t.id = comments.main_comment_id)

随后查询所有的表

Id

reply_to_comment_Id

main_comment_id

message

author

2

1

1

子评论

张三

3

2

1

子子评论

老王

4

null

null

我也是主评论

张七

从中筛选出main_comment_id = '1'

Id

reply_to_comment_Id

main_comment_id

message

author

2

1

1

子评论

张三

3

2

1

子子评论

老王

Hi~