MySQL JOIN有3个表,COUNT()不起作用

时间:2010-07-28 15:56:19

标签: mysql sql join

我的MySQL语句出了问题。我需要一个查询来计算用户创建的注释数量和主题数量。我的表结构是这样的:

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'值完全错误,我不太明白为什么。

我希望有人可以帮助我吗?

5 个答案:

答案 0 :(得分:5)

更改为

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

这将计算与用户ID匹配的不同主题和主题注释的数量。之前,您计算了给定用户的主题和主题注释的交叉积中的行数。

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

答案 1 :(得分:2)

快速拍摄:尝试用计数(不同字段)替换计数(字段)

答案 2 :(得分:2)

首先,您可以删除整个WHERE子句。没有必要,因为你已经在JOIN中处理了它。

要解决您的问题,请在SELECT子句中使用此代码,而不要使用当前的COUNT语句:

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

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

答案 3 :(得分: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)作为其他一些答案。事实上,这可能会在性能方面更有效率。

答案 4 :(得分:0)

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

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