2013-05-01 56 views
1

我有这个样子
获得最大的用户评分与分钟时间总结

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 

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

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查询做到这一点? 在此先感谢

+0

我想你的意思是'2 | 1 | 2 | 30'不'1 | 1 | 2 | 30' – 2013-05-02 00:28:18

回答

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 

输出

╔═════════╦═════════╦══════════╦═════════╗ 
║ 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 

输出

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

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;