更新
感谢@forpa和@trincot在下面分享他们的解决方案和想法。我让它使用以下代码(演示):
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表和数据:
表结构
-----------------------------------------
| Column            | Type              |
+++++++++++++++++++++++++++++++++++++++++
| comment_id        | integer           |
+---------------------------------------+
| parent_comment_id | integer           |
+---------------------------------------+
| comment_text      | text              |
-----------------------------------------表数据
--------------------------------------------------------------------
| 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(所有以第二个评论开头的评论)返回。
我需要一个中间/连接表吗?我需要改变我的桌子结构吗?或者,我是否需要使用另一个数据库引擎来实现?
发布于 2019-12-20 14:33:42
具有递归的CTE
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见演示。
结果:
| 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 |发布于 2019-12-20 14:34:28
如果sqlite版本为3.8.4或更高版本,则可以使用递归with子句:
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。
https://stackoverflow.com/questions/59426778
复制相似问题