MySQL:带 GROUP BY 的条件 MIN()

MySQL: Conditional MIN() with GROUP BY

我有一个名为 times 的 table,我在其中记录赛车游戏的比赛信息:

race_id     map     name    time
30509       desert  Peter   12.68
30510       desert  Jakob   10.72
30511       desert  Peter   18.4
30512       jungle  Peter   39.909
30513       jungle  Peter   39.84
30514       desert  Harry   16.129
30515       space   Harry   774.765
30516       jungle  Jonas   46.047
30517       city    Jonas   23.54
30518       city    Jonas   23.13
30519       desert  Mike    22.9
30520       space   Fred    174.244

我有两个问题。我最好怎么做:

  1. 寻找给定地图上的最短时间(世界纪录)?

我试过这个查询:

SELECT *, MIN(time) FROM times WHERE map = 'desert';

这会产生一个看似不正确的任意行,其中添加了一个名为 MIN(time) 的列,其中正确的最短时间是。

  1. 寻找所有地图上的最低时间,但如果它是由某个玩家完成的(找到给定玩家的所有世界记录)?

为此,我尝试了这个查询:

SELECT *, MIN(time) FROM times WHERE name = 'Peter' GROUP BY map;

这似乎只是 return 每个地图给定名称的第一行,无论它是否是最短时间。

我是 SQL(MySQL) 的新手,所以我可能遗漏了一些明显的东西。我已经四处寻找了很长一段时间,我们将不胜感激任何帮助。谢谢!

如果你想在给定的比赛中获得最快的表现,你可以 order bylimit:

select *
from times
where map = 'desert'
order by time limit 1

另一方面,如果您想要给定用户的所有比赛记录,那就有点不同了。一种选择使用相关子查询进行过滤:

select t.*
from times t
where 
    name = 'Peter' 
    and time = (select min(t1.time) from times t1 where t1.map = t.map)

Finding the lowest time (world record) on a given map

SELECT `time`
FROM times
WHERE map = @map
ORDER BY `time` ASC 
LIMIT 1

Finding the lowest time on all maps, but only if it's done by a certain player (find all world records by given player)

SELECT `time`
FROM times
WHERE name = @name
ORDER BY `time` ASC 
LIMIT 1