2015-08-31 43 views
-1

有三个表。 用户,,评论。表类似于评论具有与用户关联的行。我需要表的所有用户及其关联的行数,如评论。只有一个表关联时很容易。但是,这是我的查询。使用左连接从多个表中计数关联的行

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

+0

嗨,编辑。希望现在会清楚。 –

+0

你试过用'DISTINCT'吗? – Lamak

+1

“请不要用子查询发布答案”我没有看到任何其他解决方法。子查询有什么问题? – AdamMc331

回答

2

你可以得到每个单独的表的用户数,就像这样:

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; 

下面是一个例子SQL Fiddle

+0

非常感谢。我一直在寻找这个答案。有用。再次感谢。 –

+0

@ mahbub.kuet很高兴我能帮到你。如果这是您使用的解决方案,请随时接受答案,以便将来的读者知道您是如何解决问题的。 – AdamMc331

+0

嗨。你在那里 ?我已经选择了正确的答案,但只是撤销它,因为你的解决方案也使用子查询,我观察到它花费了大约相同的时间,像纯粹的子查询解决这个问题。我需要的解决方案没有任何子查询。你能告诉我是否有可能没有。如果我不能获得更多解决方案,我会在12小时后再次接受您的答案。请耐心等待未来12小时。 –