在一个查询 MYSQL 上从 2 个不同的表中计算 2 个不同的东西
Posted
技术标签:
【中文标题】在一个查询 MYSQL 上从 2 个不同的表中计算 2 个不同的东西【英文标题】:Count 2 different things from 2 different table on one query MYSQL 【发布时间】:2014-07-17 13:01:41 【问题描述】:我试图用一个查询从 2 个不同的表中计算 2 个不同的东西。
我的问题是我的一个连接会影响另一个连接计数。
我希望每个联接都计数,而与另一个联接的计数没有任何联系。
这里是查询:
SELECT score.score, u.user_name,
COUNT(mrank.user_id) as rank, COUNT(cr.id) as completedChallenges
FROM user u
LEFT OUTER JOIN challenges_score_user_rel score
ON score.user_id = u.id AND score.challenge_group_id = 0
LEFT OUTER JOIN challenges_score_user_rel mrank
ON mrank.score >= score.score AND mrank.challenge_group_id = 0 AND (SELECT forGym.gym
FROM user forGym WHERE forGym.id = mrank.user_id) = 22
LEFT OUTER JOIN challenges_requests cr
ON u.id = cr.receiver AND cr.status = 3
WHERE u.gym = 22 AND score.score IS NOT NULL GROUP BY u.id ORDER BY score.score DESC LIMIT 20
+------------------+------+---------------------+
| score| user_name | rank | completedChallenges |
+------------------+------+---------------------+
| 999 | A | 3 | 3 |
+------------------+----------------------------+
| 155 | B | 2 | 0 |
+------------------+----------------------------+
| 130 | C | 3 | 0 |
+------------------+----------------------------+
| 24 | D | 4 | 0 |
+------------------+----------------------------+
从我得到的结果中可以看出,用户 A 排在第一位,但排名第 3。
排名应该是按分数排序的数字。
排名的计数来自此连接:
LEFT OUTER JOIN Challenges_score_user_rel mrank
ON mrank.score >= score.score AND mrank.challenge_group_id = 0 AND (SELECT forGym.gym
FROM user forGym WHERE forGym.id = mrank.user_id) = 22
如果我删除此连接:
LEFT OUTER JOIN challenges_requests cr
ON u.id = cr.receiver AND cr.status = 3
计数很好,我得到了所有用户的正确排名。
为什么 2 个连接会相互影响我可以让它们依靠它们自己吗?
【问题讨论】:
【参考方案1】:解决这个问题的最简单方法是使用count(distinct)
:
SELECT score.score, u.user_name,
COUNT(distinct mrank.user_id) as rank,
COUNT(distinct cr.id) as completedChallenges
问题是您要为每个用户获得一个笛卡尔积。如果数字很大,那么这不是性能最佳的解决方案。在这种情况下,您希望在 from
子句中预聚合数据或在 SELECT
子句中使用相关子查询。
【讨论】:
谢谢,我刚刚想到了!及其工作:)以上是关于在一个查询 MYSQL 上从 2 个不同的表中计算 2 个不同的东西的主要内容,如果未能解决你的问题,请参考以下文章