SQL:计算特定作者撰写的每篇帖子的评论数量

时间:2015-11-27 00:33:51

标签: mysql sql database select join

我总觉得我需要提高我的SQL知识,我正在尝试,但仍然没有成功找到我的问题的答案。

我有2个表:PostComments

Post表格有PK PostID, Username, Title, Content

Comments表格有PK CommentID, FK PostID, Username, Content

Username中{p> PostID是帖子作者的UsernameComments是评论者的username。其他一切都应该是非常自我解释的。

主要挑战:我想选择该特定作者发布的所有帖子并显示每个帖子的评论数量,如果未找到评论则显示零。所有在一个查询中(如果可能?)

到目前为止,我最接近的是:

SELECT p.*, COUNT(*) as CommentAmount
FROM Posts p
LEFT OUTER JOIN Comments c
ON p.PostID = c.PostID
WHERE p.Username = 'author1'
GROUP BY c.PostID

它以某种方式工作,但如果没有该PostID的注释,则既不显示Post数据也不显示CommentAmount(0) - 这是有意义的,因为它没有找到任何具有相同c的p.PostID .PostID。如何让它显示0 CommentAmount?甚至可能吗?

以下是我设置的SQL Fiddle示例,以便您也可以进行测试!:http://sqlfiddle.com/#!9/f8941

更新:我在架构中犯了一点错误......抱歉,伙计们。修正了上面的小提琴^

UPDATE2:谢谢大家的惊人答案!有趣的是,大多数解决方案如何在SQL Fiddle上完美运行,但似乎无法使用MySQL Workbench在云上运行我的数据库......我现在必须对此进行调查,谢谢大家!

6 个答案:

答案 0 :(得分:2)

这个怎么样?:

SELECT p.*,
  (SELECT COUNT(*) FROM Comments WHERE PostID=p.PostID) AS num_comments
FROM Posts p
WHERE p.Username = 'author1'

答案 1 :(得分:1)

您可以尝试以下操作。

SQL Fiddle

SELECT kk.*, IFNULL(_aa.total, 0) AS total_comments
FROM Posts AS kk
LEFT JOIN (
    SELECT aa.PostID, COUNT(*) AS total
    FROM Posts AS aa
    LEFT JOIN Comments AS bb
    ON aa.PostID = bb.PostID
    GROUP BY bb.PostID
) AS _aa
ON kk.PostID = _aa.PostID
WHERE kk.Username = 'author1'

同时在GROUP BY子句中检查thisthis关于SELECT和非聚合列的内容。

答案 2 :(得分:1)

对您的查询进行少量更改:

SELECT p.*, COUNT(c.CommentID) as CommentAmount
FROM Posts p
LEFT OUTER JOIN Comments c
ON p.PostID = c.PostID
WHERE p.Username = 'author1'
GROUP BY c.PostID

答案 3 :(得分:1)

您只需要通过添加GROUP BY并将COUNT()聚合参数更改为指向Comments来调整查询,以便在没有0时启用存储值Comments对特定帖子的评论。

COUNT()中哪一列放在NULL内并不重要,因为当不符合JOIN条件时,每列都有SELECT p.*, COUNT(c.CommentID) AS CommentAmount FROM Posts p LEFT JOIN Comments c ON p.PostID = c.PostID WHERE p.username = 'author1' GROUP BY 1,2,3,4 值。

dmg

答案 4 :(得分:1)

你唯一的问题是你的小提琴XD一切正常你只是没有作者1帖子没有评论!看起来我添加了一个http://sqlfiddle.com/#!9/9f2f6/1

答案 5 :(得分:1)

SELECT p.*, (select COUNT(*) from comments c where c.PostID = p.PostID)
FROM Posts p
WHERE p.Username = 'author1'