2015-12-31 164 views
2

我想从3个表(消息,user_comment_messages和user_like_messages)作出SQL查询,我需要得到每个消息与喜欢和评论的总数,其实我'米试着这个:SQL查询计数与两个连接

SELECT m.id, COUNT(c.id) AS t_comment, COUNT(l.id) AS t_like 
FROM messages m 
JOIN user_comment_messages c ON c.message_id = m.id 
JOIN user_like_messages l ON l.message_id = m.id 
GROUP BY m.id; 

当我执行查询时,我在两列中得到相同的值,是不正确的。所以我试图用一个子查询:

SELECT m.id, 
(SELECT COUNT(*) FROM user_comment_messages c WHERE m.id = c.message_id) AS t_like, 
(SELECT COUNT(*) FROM user_like_messages l WHERE m.id = l.message_id) AS t_comment 
FROM messages m 
ORDER BY m.id 

这个效果很好,但在我的开发环境,我不能使用子查询,才加入。是否有另一种方法来实现这一目标?

谢谢!

回答

3

我认为你可以使用distinctcount函数计算的commentid小号不同的事件和likeid S:

SELECT m.id, 
     COUNT(DISTINCT c.id) AS t_comment, 
     COUNT(DISTINCT l.id) AS t_like 
FROM messages m 
LEFT JOIN user_comment_messages c ON c.message_id = m.id 
LEFT JOIN user_like_messages l ON l.message_id = m.id 
GROUP BY m.id; 
+1

你需要一个外部联接的消息/喜欢吗? – Drumbeg

+0

@Drumbeg,是的,如果任何表没有行,那么应该留下连接。 –

+0

@Drumbeg,???我根据你的评论编辑了我的答案,并提出了你的评论...............计数将忽略空值 –

0

您使用LEFT JOIN,这个你可以得到所有的消息既可以采用具有类似或意见或没有喜欢或评论。

SELECT m.id, 
     IFNULL(COUNT(DISTINCT c.id),0) AS t_comment, 
     IFNULL(COUNT(DISTINCT l.id),0) AS t_like 
FROM messages m 
LEFT JOIN user_comment_messages c ON c.message_id = m.id 
JOIN user_like_messages l ON l.message_id = m.id 
GROUP BY m.id;