sql-server - SELECT 注释及其回复 SQL Server

标签 sql-server select nested comments reply

我有一个评论表(ID、用户名、用户电子邮件、CommentBody、PostID)

以及另一个用于回复的表(ID、用户名、用户电子邮件、SubCommentBody、ParentCommentID)

在这种情况下,我只有一个嵌套评论/回复,每个评论可以有多个回复,但回复不能有任何回复

例如:

评论表

ID    UserName    UserEmail    CommentBody    PostID
--    --------    ---------    -----------    ------
1     Dave        <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="3b5a7b5c565a525715585456" rel="noreferrer noopener nofollow">[email protected]</a>  hello...       148
2     Alex        <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c3a183a4aea2aaafeda0acae" rel="noreferrer noopener nofollow">[email protected]</a>  hi....         205
3     John        <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="e083a0878d81898cce838f8d" rel="noreferrer noopener nofollow">[email protected]</a>  something..    205

回复表

ID    UserName    UserEmail    SubCommentBody    ParentCommentID
--    --------    ---------    -----------       ---------------
1     Jimmy       <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="107750777d71797c3e737f7d" rel="noreferrer noopener nofollow">[email protected]</a>  BlaBla...         1
2     Ben         <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="670f27000a060e0b4904080a" rel="noreferrer noopener nofollow">[email protected]</a>  Fine....          1
3     Jerry       <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="5e331e39333f3732703d3133" rel="noreferrer noopener nofollow">[email protected]</a>  something..       2

我如何编写查询来获取评论及其回复?我不知道:)

最佳答案

仅使用回复

无需不同的评论和回复,因为它们具有相同的目的和结构(名称、正文等)。

仅使用回复(ID、用户名、用户电子邮件、正文、日期、ParentReplyId、PostId)

没有父级意味着根注释。如果它有父级,请将回复放在其父级下方。

使用日期对回复进行排序。

使用递归查询

要加载给定回复的所有回复(分层结构),请使用递归查询。例如,加载Id=13回复的所有回复,在SQL Server中是:

;WITH x AS
(
    -- anchor:
    SELECT Id, UserName, Body, ParentReplyId
    FROM Replies WHERE ParentReplyId = 13
    UNION ALL
    -- recursive:
    SELECT t.Id, t.FirstName, t.Body, t.ParentReplyId
    FROM x INNER JOIN Replies AS t
    ON t.ParentReplyId = x.Id
)
SELECT Id, FirstName, Body, ParentReplyId, FROM x

要加载给定帖子的所有回复,无需递归查询,只需加载链接到给定PostId的所有回复即可:

SELECT * FROM Replies WHERE PostId = 100

关于sql-server - SELECT 注释及其回复 SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39435348/

相关文章:

sql - 更新如何工作?

sql - 列以相反顺序定义的 2 个索引之间的差异

MYSQL 在同一个表上使用 Group By Clauses 进行子查询...

SQL 从两个表内连接中选择

mysql - 嵌套 SELECT 查找最高值,如果未找到则显示 0

javascript - 如何通过父 id-s 加深数组 (JavaScript)

sql-server - 尝试更改 SQL Server IP 设置。配置管理器告诉我 "The specified file is read only"

c# - Linq 匿名类型成员必须在子查询中声明

ruby-on-rails-3 - Rails 3的嵌套脚手架生成器?

python - 比较 2 个嵌套字典并显示差异