使用单个SQL查询选择包含父注释的所有回复

时间:2014-12-12 06:17:04

标签: c# sql

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

评论

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"
    }

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

3 个答案:

答案 0 :(得分:0)

试试这个

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 :(得分:0)

我认为这个查询可以获取命令的所有记录(Parent + child)。

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

此外,当您想要分别识别父母和子女时。在select查询中也获取parentID。

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

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

答案 2 :(得分:0)

这就是我的所作所为:

  1. 根据您的问题创建一个表格。
  2. 使用您问题中的测试数据填充它。
  3. 创建一个返回结果的CTE查询。
  4. 解决方案的关键是WITH RECURSIVE公用表表达式。

    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;