Mysql 使用左联接计算多个表中的关联行

Mysql 使用左联接计算多个表中的关联行,mysql,sql,join,left-join,Mysql,Sql,Join,Left Join,有三张桌子用户,喜欢,评论。表like和comment具有与用户关联的行。我需要表中的所有用户及其关联行数,如和注释。当只有一个表关联时,很容易做到这一点。然而,这是我的疑问 SELECT u.id as id, u.display_name as displayName, COUNT(x.user_id) as likeCount, COUNT(y.user_id) as commentCount FROM `user` u LEFT JOIN

有三张桌子用户喜欢评论。表likecomment具有与用户关联的行。我需要表中的所有用户及其关联行数,如注释。当只有一个表关联时,很容易做到这一点。然而,这是我的疑问

SELECT  u.id as id, u.display_name as displayName, 
        COUNT(x.user_id) as likeCount,
        COUNT(y.user_id) as commentCount
FROM `user` u
    LEFT JOIN
        `like` x ON x.user_id = u.id
    LEFT JOIN
        `comment` y ON y.user_id = u.id
GROUP BY u.id
表关系: 一个用户有很多喜好 一个用户有很多评论


commentCount给出了正确的行数,但likeCount给出了错误的行数请不要发布使用子查询的答案。我希望它只包含一个SELECT子句。我正在使用MySQL。TIA

您可以获得每个表的用户计数,如下所示:

SELECT user, COUNT(*) AS t1Count
FROM table1
GROUP BY user;

SELECT user, COUNT(*) AS t2Count
FROM table2
GROUP BY user;
然后,您可以将这两个用户连接到
Users
表中,以获得每个用户的计数。您应该使用
COALESCE()
返回0的空值:

SELECT u.id, COALESCE(t1.t1Count, 0), COALESCE(t2.t2Count, 0)
FROM users u
LEFT JOIN(
   SELECT user, COUNT(*) AS t1Count
   FROM table1
   GROUP BY user) t1 ON u.id = t1.user
LEFT JOIN(
   SELECT user, COUNT(*) AS t2Count
   FROM table2
   GROUP BY user) t2 ON u.id = t2.user;

下面是一个示例。

您好,已编辑。希望现在一切都清楚了。您是否尝试过使用
DISTINCT
?“请不要用子查询发布答案”我看不到任何其他解决方法。子查询有什么问题?@Lamak我不明白为什么要使用DISTINCT?顺便说一句,让我试试第一个答案。看看这些表格中的一些示例数据,看看您期望的结果,以及您得到的结果可能会有所帮助。非常感谢。我一直在寻找这个答案。它起作用了。再次感谢。@mahbub.kuet很高兴我能帮忙。如果这是您使用的解决方案,请随意接受答案,以便将来的读者了解您是如何解决问题的。您好。你在吗?我选择了正确的答案,但只是撤销它,因为您的解决方案也使用子查询,而且我观察到,它所用的时间与此问题的纯子查询解决方案差不多。我需要没有任何子查询的解决方案。你能告诉我不可能吗。如果我得不到更多的解决方案,我会在12小时后再次接受你的回答。请耐心等待接下来的12小时。@mahbub.kuet我认为这是不可能的。考虑并排查看连接的行,无法进行聚合以知道用户1在表1中出现了两次,在表2中出现了一次。在这种情况下,它们似乎出现在每个表中两次,情况并非如此。这不能用一个联接来完成。