我有一个看起来像这样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查询? 提前致谢
下面这个查询会给你的部分结果。
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
不支持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
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;