获取与最小时间总和最大用户评分(Get max user scores with min time

2019-10-18 02:55发布

我有一个看起来像这样MySQL表

scores
game_id | level | score | time
--------+-------+-------+-----
1       | 1     | 1     | 10
1       | 2     | 0     | 10
1       | 3     | 1     | 20
2       | 1     | 1     | 5
2       | 2     | 1     | 15
2       | 3     | 0     | 10
3       | 1     | 0     | 10
3       | 2     | 0     | 10
3       | 3     | 0     | 10

games
game_id | user_id
--------+--------
1       | 1
2       | 1
3       | 2

我需要所以总结点和每场比赛的时间来查询它,所以它看起来像这样

game_id | user_id | sumPoints | sumTime
--------+---------+-----------+--------
1       | 1       | 2         | 40
2       | 1       | 2         | 30
3       | 2       | 0         | 30

而且比我需要得到最好的成绩为每个用户(最好成绩我的意思是其中max(sumPoints)和最小(sumTime),所以它看起来是这样的:

game_id | user_id | sumPoints | sumTime
--------+---------+-----------+--------
2       | 1       | 2         | 30
3       | 2       | 0         | 30

这就是最终的结果。 我可以做到哪里点和时间总结的一部分,但我不知道我怎样才能得到每个用户台面分数。 我不知道,我怎么能做到这一点通过SQL查询? 提前致谢

Answer 1:

下面这个查询会给你的部分结果。

SELECT  a.game_ID, 
        b.user_id,
        SUM(a.Score) sumPoint, 
        SUM(a.time) sumTime
FROM    scores a
        INNER JOIN games b
            ON a.game_ID = b.game_ID
GROUP   BY a.game_ID, b.user_id
  • SQLFiddle演示

OUTPUT

╔═════════╦═════════╦══════════╦═════════╗
║ GAME_ID ║ USER_ID ║ SUMPOINT ║ SUMTIME ║
╠═════════╬═════════╬══════════╬═════════╣
║       1 ║       1 ║        2 ║      40 ║
║       2 ║       1 ║        2 ║      30 ║
║       3 ║       2 ║        0 ║      30 ║
╚═════════╩═════════╩══════════╩═════════╝

由于MySQL不支持Windows的功能就像任何其他的RDBMS,这可能是凌乱出示你想要的结果。

SELECT  a.*
FROM
        (
            SELECT  a.game_ID, 
                    b.user_id,
                    SUM(a.Score) sumPoint, 
                    SUM(a.time) sumTime
            FROM    scores a
                    INNER JOIN games b
                        ON a.game_ID = b.game_ID
            GROUP   BY a.game_ID, b.user_id
        ) a
        INNER JOIN
        (
            SELECT  user_ID,
                    MIN(sumTime) sumTime
            FROM
                    (
                        SELECT  a.game_ID, 
                                b.user_id,
                                SUM(a.Score) sumPoint, 
                                SUM(a.time) sumTime
                        FROM    scores a
                                INNER JOIN games b
                                    ON a.game_ID = b.game_ID
                        GROUP   BY a.game_ID, b.user_id
                    ) s
            GROUP   BY user_ID
        ) b ON  a.user_id = b.user_id AND
                a.sumTime = b.sumTime
  • SQLFiddle演示

OUTPUT

╔═════════╦═════════╦══════════╦═════════╗
║ GAME_ID ║ USER_ID ║ SUMPOINT ║ SUMTIME ║
╠═════════╬═════════╬══════════╬═════════╣
║       2 ║       1 ║        2 ║      30 ║
║       3 ║       2 ║        0 ║      30 ║
╚═════════╩═════════╩══════════╩═════════╝


Answer 2:

JW的回答基本上是我的一样。 我只是觉得,使用户在这么早,似乎事情不必要的复杂。 怎么样...

SELECT x.*
     , u.user_id
  FROM 
     ( SELECT game_id
            , SUM(score) ttl_score
            , SUM(time) ttl_time 
         FROM scores 
        GROUP 
           BY game_id
     ) x
  JOIN
     ( SELECT ttl_score
            , MIN(ttl_time) min_ttl_time
         FROM
            ( SELECT game_id
                   , SUM(score) ttl_score
                   , SUM(time) ttl_time 
                FROM scores 
               GROUP 
                  BY game_id 
            ) a
        GROUP
           BY ttl_score
     ) y
    ON y.ttl_score = x.ttl_score
   AND y.min_ttl_time = x.ttl_time
  JOIN games g
    ON g.game_id = x.game_id;


文章来源: Get max user scores with min time sums