[英]Get max user scores with min time sums
我有看起来像这样的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)和min(sumTime)的位置,因此它看起来像这样:
game_id | user_id | sumPoints | sumTime
--------+---------+-----------+--------
2 | 1 | 2 | 30
3 | 2 | 0 | 30
那就是最终结果。 我可以做点和时间相加的部分,但是我不知道如何获得每个用户的最高分。 我想知道如何通过SQL查询做到这一点? 提前致谢
下面的查询将为您提供部分结果。
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
OUTPUT
╔═════════╦═════════╦══════════╦═════════╗
║ GAME_ID ║ USER_ID ║ SUMPOINT ║ SUMTIME ║
╠═════════╬═════════╬══════════╬═════════╣
║ 1 ║ 1 ║ 2 ║ 40 ║
║ 2 ║ 1 ║ 2 ║ 30 ║
║ 3 ║ 2 ║ 0 ║ 30 ║
╚═════════╩═════════╩══════════╩═════════╝
由于MySQL
不像其他RDBMS一样支持Windows功能,因此可能难以获得所需的结果。
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
OUTPUT
╔═════════╦═════════╦══════════╦═════════╗
║ GAME_ID ║ USER_ID ║ SUMPOINT ║ SUMTIME ║
╠═════════╬═════════╬══════════╬═════════╣
║ 2 ║ 1 ║ 2 ║ 30 ║
║ 3 ║ 2 ║ 0 ║ 30 ║
╚═════════╩═════════╩══════════╩═════════╝
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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.