MySQL连接有3个表,COUNT()不起作用
我的MySQL语句有问题。我需要一个查询,统计用户创建的评论数和主题数。我的表格结构如下所示: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 ... 到目前为止,我
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”,而它应该是一个更高的数字……是的,就是它!查询正在运行!非常感谢你!格瑞,贝尔特是的,就是这样!查询正在运行!非常感谢你!格瑞,伯特