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

如何在mysql中左键连接多个一对多表?,mysql,sql,join,left-join,Mysql,Sql,Join,Left Join,我在mysql中连接三个表时遇到问题 假设我们有一个名为posts的表,我把我的条目保存在其中,我有一个名为likes的表,我在其中存储用户id和post id,还有一个名为comments的表,我在其中存储用户id和post id以及注释文本 我需要一个查询,获取我的条目列表,以及每个条目的赞数和注释数 我正在使用此查询: SELECT posts.id, count(comments.id) as total_comments, count(likes.id) as total_likes

我在mysql中连接三个表时遇到问题

假设我们有一个名为
posts
的表,我把我的条目保存在其中,我有一个名为
likes
的表,我在其中存储用户id和post id,还有一个名为
comments
的表,我在其中存储用户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
但是这个查询有一个问题,如果一个条目的注释为空,那么likes计数就可以了,但是假设一个条目有2个注释和4个likes,那么total_comments和total_likes都将是“8”,这意味着mysql将它们相乘。 我很困惑,我不知道我该怎么办


感谢advace。

使用
count(distinct comments.id)
count(distinct likes.id)
,前提是这些id是唯一的。

这是一种方法(假设mysql允许派生表):

您还可以使用相关子查询。当没有匹配的记录时,您可能需要一个案例陈述来说明输入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` 

谢谢,但此查询返回的第一条记录为12个喜欢和2个注释(它有4个喜欢和2个注释),其他所有行为空。看起来相关子查询路径可能是最好的。我还没有听说过它们。你应该尽最大努力避免子查询我同意这就是为什么;这不是我的第一个建议
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`