我总觉得我需要提高我的SQL知识,我正在尝试,但仍然没有成功找到我的问题的答案。
我有2个表:Post
和Comments
。
Post
表格有PK PostID, Username, Title, Content
。
Comments
表格有PK CommentID, FK PostID, Username, Content
。
Username
中{p> PostID
是帖子作者的Username
,Comments
是评论者的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在云上运行我的数据库......我现在必须对此进行调查,谢谢大家!
答案 0 :(得分:2)
这个怎么样?:
SELECT p.*,
(SELECT COUNT(*) FROM Comments WHERE PostID=p.PostID) AS num_comments
FROM Posts p
WHERE p.Username = 'author1'
答案 1 :(得分:1)
您可以尝试以下操作。
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'
答案 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'