使用单个 SQL 查询选择带有父注释的所有答复

本文关键字:注释 单个 SQL 查询 选择 | 更新日期: 2023-09-27 18:34:05

我有一个用于存储注释的表,其结构如下:

评论

ID | post_id | comment        | parent    
1  |  1      | hello world    | null
2  |  1      | reply 1        | 1
3  |  1      | reply 2        | 1
4  |  1      | reply 3        | 1

我想使用单个SQL查询获取父评论及其所有回复。目前,我正在使用嵌套查询来检索特定父评论的回复,我知道这不是最佳做法。我需要使用单个查询来完成此操作。

我目前的 SQL 查询代码段是:

parent_id =("select id,comment from comments where post_id='1' and parent='null'")["id"]
loop{       
      "select comment from comments where post_id='1' and parent= parent_id"
    }

我正在使用这些嵌套查询来获取带有回复的评论,使用单个查询实现这一目标的最佳实践是什么?

使用单个 SQL 查询选择带有父注释的所有答复

我认为这个查询是获取命令的所有记录(父+子)的ennogh。

select id,comment from comments where post_id='1'

另外,当您要分别识别父项和子项时。在选择查询中获取父 ID。

select id,comment, parent from comments where post_id='1'

在 c# 代码中,可以找到父级(父级为 null)和子级(父级为 1)。

像这样尝试

select t.id,t1.comment from table1 t inner join table t1 on t1.id=t.parentid
and t.parentid is not null and t1.parentid is null

这是我所做的:

  1. 根据您的问题创建一个表格。
  2. 用问题中的测试数据填充它。
  3. 创建返回预期
  4. 结果的 CTE 查询。

解决方案的关键是 WITH 递归公用表表达式。

create table post_comment(
    id serial not null primary key,
    post_id int not null,
    comment text,
    parent_id int
);
insert into post_comment(post_id, comment, parent_id) values(1, 'hello world', null);
insert into post_comment(post_id, comment, parent_id) values(1, 'reply 1', 1);
insert into post_comment(post_id, comment, parent_id) values(1, 'reply 1', 1);
insert into post_comment(post_id, comment, parent_id) values(1, 'reply 1', 1);
with recursive comments(c) as (
    select * from post_comment where id = 1
union all
    select * from post_comment where parent_id = 1
)
select * from comments;