我在mysql中连接三个表时遇到问题。
假设我们有一个名为posts
的表,我将其中的条目保存在其中,我有一个名为likes
的表,我存储了user_id和post_id,第三个表名为comments
我将user_id和post_id以及评论的文本存储在其中。
我需要一个查询来获取我的条目列表,每个条目都有喜欢和评论的数量。
我正在使用此查询:
SELECT posts.id, count(comments.id) as total_comments, count(likes.id) as total_likes
FROM `posts`
LEFT OUTER JOIN comments ON comments.post_id = posts.id
LEFT OUTER JOIN likes ON likes.post_id = posts.id
GROUP BY posts.id
但是这个查询存在问题,如果某个项目的注释为空,那么计数就好了,但是假设一个条目有2条评论和4条评论,则total_comments和total_likes都将为“8”,这意味着那个mysql将它们相乘。 我很困惑,我不知道我该做什么。
先谢谢。
答案 0 :(得分:7)
使用count(distinct comments.id)
和count(distinct likes.id)
,前提是这些ID是唯一的。
答案 1 :(得分:4)
这是接近它的一种方法(假设mysql允许派生表):
SELECT posts.id, comments.total_comments, likes.total_likes
FROM `posts`
LEFT OUTER JOIN (select post_id, count(id) as total_comments from comments) comments
ON comments.post_id = posts.id
LEFT OUTER JOIN (select post_id, count(id) as total_likes from likes) likes
ON likes.post_id = posts.id
您还可以使用相关子查询。当没有匹配的记录时,你可能想要一个案例陈述来计算输入0。
让我们尝试相关的子查询:
SELECT posts.id,
(select count(Id) from comments where post_id = posts.id) as total_comments,
(select count(Id) from likes where post_id = posts.id) as total_likes
FROM `posts`