0

我有以下 PostgreSQL 表来存储不同帖子的评论:

评论表:

commentID | parentID | postID | content | author | created

我现在想用一个查询来检索,给定一个 postID,对帖子的所有评论以及每个评论的回复数。如果 parentID 不为 null 并且等于其父项的 commentID,则评论是回复。

我尝试了类似以下的方法,我自己加入表格并查找匹配项,parentID = commentID但我无法使其正常工作,希望得到一些帮助:)

SELECT comments.commentID as commentID, comments.parentID as parentID, comments.postID as postID,
comments.content as content, comments.author as author, comments.created as created,
COALESCE(c1.numReplies, 0) as numReplies
FROM comments c0
LEFT JOIN (
    SELECT parentID, COUNT(*) FILTER (WHERE postID = :givenPostID) as numReplies as numReplies
    FROM comments
) c1 on c0.commentID = c1.parentID
WHERE c0.postID = :givenPostID;

4

1 回答 1

2

这看起来是子查询或横向连接的好地方:

select c.*, c1.no_replies
from comments c
cross join lateral (
    select count(*) no_replies
    from comments c1
    where c1.parentid = c.commentid
) c1 
where c.postid = :givenpostid

旁注 - 你想写的查询可能是:

SELECT c0.*, COALESCE(c1.numReplies, 0) as numReplies
FROM comments c0
LEFT JOIN (
    SELECT parentID, COUNT(*) as numReplies
    FROM comments
    GROUP BY parentID
) c1 on c0.commentID = c1.parentID
WHERE c0.postID = :givenPostID

子查询略有不同:首先,它需要一个GROUP BY子句才能成为有效的 SQL;而且,不需要条件计数。

于 2020-10-18T19:40:44.977 回答