2010-07-28 95 views
2

我的MySQL语句有问题。我需要一个查询来计算用户创建的评论数量和主题数量。我的表结构是这样的:MySQL连接3个表和COUNT()不工作

Table 'users' 
------------- 
user_id 
user_name 
... 

Table 'topics' 
-------------- 
topic_id 
topic_user_id 
... 

Table 'topiccomments' 
--------------------- 
topiccomment_id 
topiccomment_user_id 
... 

到目前为止,我已经能够生产此查询:

SELECT 
    u.user_id, 
    u.user_name, 
    COUNT(t.topic_user_id) as topic_count, 
    COUNT(tc.topiccomment_user_id) as topiccomment_count 
FROM 
    users as u 
    JOIN topiccomments as tc ON u.user_id = tc.topiccomment_user_id 
    JOIN topics as t ON u.user_id = t.topic_user_id 
WHERE 
    u.user_id = t.topic_user_id AND 
    u.user_id = tc.topiccomment_user_id 
GROUP BY 
    u.user_id 

执行此查询,但“TOPIC_COUNT”和“topiccomment_count”值完全错误,我不明白为什么。

我希望这里有人能帮助我吗?

+0

最好将其作为两个单独的查询来完成。如果您确实需要一个查询,那么创建两个子查询。 – mdma 2010-07-28 15:58:38

+0

我需要它在一个查询中,因为我需要能够对'topic_count'和'topiccomment_count'字段进行mysql排序... 子查询的查询将如何看起来像?我没有任何经验与子查询... – brtdv 2010-07-28 16:01:32

+0

也许你可以给一个例子与数据,错误和预期的结果 – Nicolas78 2010-07-28 16:01:34

回答

5

变化

COUNT(DISTINCT t.topic_id) as topic_count, 
COUNT(DISTINCT tc.topiccomment_id) as topiccomment_count 

这将计算的不同主题和匹配的用户ID话题评论的数量。之前,您要计算给定用户的主题和主题评论的交叉产品中的行数。

如果它适用于您的情况,我会将其重构为两个查询,一个用于计算主题,另一个用于topic_comments,因为这会更有效。

+0

是的,就是这样!该查询正在工作! 非常感谢! gr,bert – brtdv 2010-07-28 16:05:31

2

快速射击:尝试更换计数(场)数(不同领域)

+0

嗨,谢谢你的回复快! 我也尝试过,但'topic_count'和'topiccomment_count'只是返回'1',而它应该是更高的数字... – brtdv 2010-07-28 15:59:35

2

首先,你可以删除整个WHERE子句。这不是必须的,因为您已经在JOIN中处理过它。

为了解决您的问题,你的SELECT子句,而不是当前计报表您在使用本:

COUNT(DISTINCT t.topic_id) as topic_count, 
COUNT(DISTINCT tc.topiccomment_id) as topiccomment_count 

您正在试图计算主题或主题评论的数量。不是用户数量(应该始终为1)。

+0

是的,就是这样!该查询正在工作! 非常感谢! gr,bert – brtdv 2010-07-28 16:05:02

0

您应该计算主题和注释ID,而不是评论/主题的user_id。

SELECT 
    u.user_id, 
    u.user_name, 
    COUNT(DISTINCT t.topic_id) as topic_count, 
    COUNT(DISTINCT tc.topiccomment_id) as topiccomment_count 
FROM 
    users as u 
    JOIN topiccomments as tc ON u.user_id = tc.topiccomment_user_id 
    JOIN topics as t ON u.user_id = t.topic_user_id 
GROUP BY 
    u.user_id 
1

JOIN的可能返回topiccommentstopics表的笛卡尔乘积因为他们之间的关系没有限制,这可以解释为什么你得到一个高计数。

一个简单的方法来解决这个问题是使用相关子查询:

SELECT u.user_id, 
     u.user_name, 
     SELECT (COUNT(*) FROM topics t WHERE t.id = u.id), 
     SELECT (COUNT(*) FROM topiccomments tc WHERE tc.id = u.id) 
FROM users u; 

您还可以使用COUNT(DISTINCT t.topic_id)COUNT(DISTINCT tc.topiccomment_id)原始查询中的一些其他的答案的建议。事实上,这在性能方面可能会更有效率。