【问题标题】:Count 2 different things from 2 different table on one query MYSQL在一个查询 MYSQL 上从 2 个不同的表中计算 2 个不同的东西
【发布时间】: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 个连接会相互影响我可以让它们依靠它们自己吗?

【问题讨论】:

    标签: mysql sql join


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,我刚刚想到了!及其工作:)
    猜你喜欢
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 2019-09-22
    • 2013-12-20
    • 1970-01-01
    相关资源
    最近更新 更多