使用单个 SQL 查询选择所有带有父评论的回复

Posted

技术标签:

【中文标题】使用单个 SQL 查询选择所有带有父评论的回复【英文标题】:Selecting All Replies with parent comment using single SQL query 【发布时间】:2014-12-12 06:17:03 【问题描述】:

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

cmets

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查询sn-p是:

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"
    

我正在使用这些嵌套查询来获取 cmets 及其回复,使用单个查询实现这一点的最佳做法是什么?

【问题讨论】:

所有条目的 postID = 1 那么你为什么要检查 parent_ID 或 parent postID = 1 表示所有父评论和子 cmets 都属于 postID 1。我需要使用单个查询检索父评论及其所有回复。在父 paret 评论下显示回复 顺便说一句你是对的。我必须弄清楚!谢谢 【参考方案1】:

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

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

另外,当您想分别识别父母和孩子时。在选择查询中也获取 parentID。

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

在c#代码中可以找到parent(parent为null)和child(Has parent as 1)。

【讨论】:

但这里有一个问题,我不想一次加载所有回复,我只需要显示 3 个依赖于特定父评论。现在呢? 您打算如何一一获得回复([123]、[456]、[789])。你问我如何识别每个包(3 个回答)?? 在页面加载时,对于特定的父评论,只有 3 个回复[1,2,3]。之后会有一个 AJAX 调用来检索相同父评论的更多回复 [4,5,6...] 在 PageLoad 上使用 select top 4 id,comment, parent from cmets where post_id='1' order by id asc 之类的查询。然后在 Ajax - 发送回复和查询的最后一个 ID:select top 3 id,comment, parent from cmets where post_id='1' and id > [LastID]【参考方案2】:

这样试试

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

【讨论】:

【参考方案3】:

这就是我所做的:

    根据您的问题创建表格。 用您问题中的测试数据填充它。 创建一个 CTE 查询,返回您期望的结果。

解决方案的关键是 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;

【讨论】:

以上是关于使用单个 SQL 查询选择所有带有父评论的回复的主要内容,如果未能解决你的问题,请参考以下文章

Mysql - 正确排序 Facebook 帖子、评论和回复

一对多查询为每个父母选择所有父母和单个***孩子

单个 SQL 选择查询与单个大 SQLselect 查询:啥更好?为啥? [关闭]

如何编写基于组合框选择的单个 sql 查询?

带有单个单词的 SQL Contains() 不会返回所有预期的行

当更新日期相同时,选择查询以获取最后一个用户更新的所有最后一行