gpt4 book ai didi

mysql - 在一个查询MYSQL上从2个不同的表中计算2个不同的东西

转载 作者:行者123 更新时间:2023-11-29 12:50:37 26 4
gpt4 key购买 nike

我正在尝试使用一个查询从 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。

排名应该是按分数排序的数字。

排名计数来自此连接:

左外连接挑战_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

计数很好,我得到了所有用户的正确排名。

为什么两个连接会互相影响,我可以让它们依赖自己吗?

最佳答案

解决这个问题的最简单方法是使用count(distinct):

SELECT score.score, u.user_name, 
COUNT(distinct mrank.user_id) as rank,
COUNT(distinct cr.id) as completedChallenges

问题是您正在为每个用户获得一个笛卡尔积。如果数字很大,那么这不是性能最佳的解决方案。在这种情况下,您需要预先聚合 from 子句中的数据或在 SELECT 子句中使用相关子查询。

关于mysql - 在一个查询MYSQL上从2个不同的表中计算2个不同的东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24804351/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com