首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何执行递归SQL语句?

如何执行递归SQL语句?
EN

Stack Overflow用户
提问于 2019-12-20 14:21:52
回答 2查看 87关注 0票数 0

更新

感谢@forpa和@trincot在下面分享他们的解决方案和想法。我让它使用以下代码(演示):

代码语言:javascript
复制
with recursive cte_comments as (
  select 
    *
  from
    comments
  where parent_comment_id = 1
  union all
  select
    this_execution.* 
  from
    cte_comments prev_execution
    inner join comments this_execution
      on this_execution.parent_comment_id = prev_execution.comment_id
) 

select * from cte_comments

原始帖子

我在一个comments数据库中有以下SQLite表和数据:

表结构

代码语言:javascript
复制
-----------------------------------------
| Column            | Type              |
+++++++++++++++++++++++++++++++++++++++++
| comment_id        | integer           |
+---------------------------------------+
| parent_comment_id | integer           |
+---------------------------------------+
| comment_text      | text              |
-----------------------------------------

表数据

代码语言:javascript
复制
--------------------------------------------------------------------
| comment_id        | parent_comment_id  | comment_text            |
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
| 1                 |                    | First comment, level 1  |
--------------------------------------------------------------------
| 2                 | 1                  | First comment, level 2  |
--------------------------------------------------------------------
| 3                 | 2                  | First comment, level 3  |
--------------------------------------------------------------------
| 4                 | 2                  | First comment, level 3  |
--------------------------------------------------------------------
| 5                 |                    | Second comment, level 1 |
--------------------------------------------------------------------
| 6                 | 5                  | Second comment, level 2 |
--------------------------------------------------------------------
| 7                 | 6                  | Second comment, level 3 |
--------------------------------------------------------------------

这些数据用于网站中的嵌套注释部分,其中comment_id是唯一的,parent_comment_id可以是null。两个或多个注释可以位于同一个parent_comment_id下面。comment_text列包含随机字符串。

问题

如何执行将返回父注释下的所有子元素的SQL搜索?例如,当我搜索注释1下的所有评论时,我希望注释2、3和4(所有以第一个注释开头的注释)返回。当我搜索评论5下的所有评论时,我希望评论6和7(所有以第二个评论开头的评论)返回。

我需要一个中间/连接表吗?我需要改变我的桌子结构吗?或者,我是否需要使用另一个数据库引擎来实现?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-20 14:33:42

具有递归的CTE

代码语言:javascript
复制
with recursive cte as (
  select * from comments
  where parent_comment_id = 1
  union all
  select t.* 
  from cte c inner join comments t
  on t.parent_comment_id = c.comment_id
) 
select * from cte

演示

结果:

代码语言:javascript
复制
| comment_id | parent_comment_id | comment_text           |
| ---------- | ----------------- | ---------------------- |
| 2          | 1                 | First comment, level 2 |
| 3          | 2                 | First comment, level 3 |
| 4          | 2                 | First comment, level 3 |
票数 1
EN

Stack Overflow用户

发布于 2019-12-20 14:34:28

如果sqlite版本为3.8.4或更高版本,则可以使用递归with子句:

代码语言:javascript
复制
with recursive cte (id, name, parent_id) as (
  select     comment_id,
             comment_text,
             parent_comment_id 
  from       comments
  where      parent_comment_id = 1
  union all
  select     c.comment_id,
             c.comment_text,
             c.parent_comment_id
  from       comments c
  inner join cte
          on c.parent_comment_id = cte.comment_id
)
select * from cte;

在条件parent_comment_id = 1中,您将提到应该检索其后代的注释的id。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59426778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档