如何在mysql中连接多个一对多表?

时间:2011-01-10 20:00:38

标签: mysql sql join left-join

我在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将它们相乘。 我很困惑,我不知道我该做什么。

先谢谢。

2 个答案:

答案 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`