我的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'值完全错误,我不太明白为什么。
我希望有人可以帮助我吗?
答案 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可能会返回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_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