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
我有两个问题。我最好怎么做:
- 寻找给定地图上的最短时间(世界纪录)?
我试过这个查询:
SELECT *, MIN(time) FROM times WHERE map = 'desert';
这会产生一个看似不正确的任意行,其中添加了一个名为 MIN(time)
的列,其中正确的最短时间是。
- 寻找所有地图上的最低时间,但仅如果它是由某个玩家完成的(找到给定玩家的所有世界记录)?
为此,我尝试了这个查询:
SELECT *, MIN(time) FROM times WHERE name = 'Peter' GROUP BY map;
这似乎只是 return 每个地图给定名称的第一行,无论它是否是最短时间。
我是 SQL(MySQL) 的新手,所以我可能遗漏了一些明显的东西。我已经四处寻找了很长一段时间,我们将不胜感激任何帮助。谢谢!
如果你想在给定的比赛中获得最快的表现,你可以 order by
和 limit
:
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
我有一个名为 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
我有两个问题。我最好怎么做:
- 寻找给定地图上的最短时间(世界纪录)?
我试过这个查询:
SELECT *, MIN(time) FROM times WHERE map = 'desert';
这会产生一个看似不正确的任意行,其中添加了一个名为 MIN(time)
的列,其中正确的最短时间是。
- 寻找所有地图上的最低时间,但仅如果它是由某个玩家完成的(找到给定玩家的所有世界记录)?
为此,我尝试了这个查询:
SELECT *, MIN(time) FROM times WHERE name = 'Peter' GROUP BY map;
这似乎只是 return 每个地图给定名称的第一行,无论它是否是最短时间。
我是 SQL(MySQL) 的新手,所以我可能遗漏了一些明显的东西。我已经四处寻找了很长一段时间,我们将不胜感激任何帮助。谢谢!
如果你想在给定的比赛中获得最快的表现,你可以 order by
和 limit
:
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