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

MySQL连接有3个表,COUNT()不起作用,mysql,sql,join,Mysql,Sql,Join,我的MySQL语句有问题。我需要一个查询,统计用户创建的评论数和主题数。我的表格结构如下所示: Table 'users' ------------- user_id user_name ... Table 'topics' -------------- topic_id topic_user_id ... Table 'topiccomments' --------------------- topiccomment_id topiccomment_user_id ... 到目前为止,我

我的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\u count”和“topiccomment\u count”的值完全错误,我不太明白为什么


我希望这里有人能帮我一下?

快速:尝试用count(独立字段)替换count(字段)

首先,您可以删除整个WHERE子句。这是不必要的,因为您已经在连接中处理了它

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

COUNT(DISTINCT t.topic_id) as topic_count,
COUNT(DISTINCT tc.topiccomment_id) as topiccomment_count
您正在尝试计算主题或主题评论的数量。不是用户数(应始终为1)。

更改为

COUNT(DISTINCT t.topic_id) as topic_count,
COUNT(DISTINCT tc.topiccomment_id) as topiccomment_count
这将计算与用户ID匹配的不同主题和主题注释的数量。之前,您计算的是给定用户的主题和主题注释的叉积中的行数


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

您应该计算主题和注释ID,而不是注释/主题的用户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

联接可能返回
topiccomments
topics
表的笛卡尔积,因为它们之间的关系没有限制,这可以解释为什么会得到高计数

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

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\u id)
COUNT(DISTINCT tc.topiccomment\u id)
,正如其他一些答案所建议的那样。事实上,就性能而言,这可能更有效。

最好将其作为两个单独的查询来执行。如果你真的需要一个查询,那么创建两个子查询。我需要在一个查询中使用它,因为我需要能够对“topic\u count”和“topiccomment\u count”字段进行mysql排序。。。带有子查询的查询是什么样子的?我没有任何子查询的经验…也许你可以给出一个数据示例,错误的和预期的结果,谢谢你这么快回复!我也尝试过,但是“topic\u count”和“topiccomment\u count”只返回“1”,而它应该是一个更高的数字……是的,就是它!查询正在运行!非常感谢你!格瑞,贝尔特是的,就是这样!查询正在运行!非常感谢你!格瑞,伯特