【发布时间】:2021-01-31 11:25:26
【问题描述】:
如果有以下三个PostgreSQL表:
发布表:
postid | title | author | created
投票表:
postid | username | vote
如果用户对帖子投了赞成票,则 vote 等于 1,如果用户没有投票,则为 0,如果用户对帖子投反对票,则为 -1。
评论表:
commentID | parentID | postID | content | author | created
如果评论不是回复,则 parentID 为 null。
我想现在收到每个帖子的标题、作者、创建日期、所有投票的总和以及 当前登录用户的投票和 cmets 的数量。 我已经对用户的投票有疑问,并询问了here,有人帮我得到了以下查询:
SELECT post.postID as postID, post.title as title, post.author as author,
post.created as created,
COALESCE(sum(votes.vote), 0) as voteCount,
COALESCE(sum(votes.vote) FILTER (WHERE votes.username = :username), 0) as userVote
FROM post
LEFT JOIN votes ON post.postID = votes.postID
GROUP BY post.postID
ORDER BY voteCount DESC
现在我尝试了另一个 LEFT JOIN 来获取这样的 cmets 数量:
COUNT(DISTINCT comments) FILTER (WHERE comments.parentID IS NULL) as numComments
LEFT JOIN comments on post.postID = comments.postID
但是,虽然 cmets 的数量有效,但每个帖子的投票数是错误的,因为 由于另一个连接,这些行似乎多次出现,产生了错误的总和,我在想办法解决这个问题时遇到了一些麻烦。
我已经尝试将 cmets 的数量作为子查询获取,以便它独立于 没有成功的票数。 任何进一步的帮助将不胜感激! :-)
【问题讨论】:
标签: sql postgresql sum inner-join sql-null