Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在一个查询中从2个不同的表中计算2个不同的内容_Mysql_Sql_Join - Fatal编程技术网

Mysql 在一个查询中从2个不同的表中计算2个不同的内容

Mysql 在一个查询中从2个不同的表中计算2个不同的内容,mysql,sql,join,Mysql,Sql,Join,我试图用一个查询从两个不同的表中计算出两个不同的东西 我的问题是我的一个连接会影响另一个连接计数 我希望每个连接都计数,而不与另一个连接的计数建立任何连接 以下是查询: 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_r

我试图用一个查询从两个不同的表中计算出两个不同的东西

我的问题是我的一个连接会影响另一个连接计数

我希望每个连接都计数,而不与另一个连接的计数建立任何连接

以下是查询:

   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排在第一位,但排名第三

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

列组的计数来自此联接:

LEFT OUTER JOIN challenges_requests cr

ON u.id = cr.receiver  AND cr.status = 3
左侧外部连接挑战\u分数\u用户\u相对链接

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)


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

谢谢,我刚刚考虑过这个问题!及其工作原理:)