MySQL:条件 MIN() 与 GROUP BY
Posted
技术标签:
【中文标题】MySQL:条件 MIN() 与 GROUP BY【英文标题】:MySQL: Conditional MIN() with GROUP BY 【发布时间】:2020-12-29 18:10:21 【问题描述】:我有一张名为 times
的表格,我在其中记录赛车游戏的比赛信息:
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;
这似乎只返回每个地图的给定名称的第一行,无论它是否是最低时间。
我对 SQL(mysql) 还很陌生,所以我可能在这里遗漏了一些明显的东西。我已经环顾四周了很长一段时间,任何帮助将不胜感激。谢谢!
【问题讨论】:
【参考方案1】:如果您想在某场比赛中获得最快的表现,您可以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)
【讨论】:
【参考方案2】:在给定地图上找到最短时间(世界纪录)
SELECT `time`
FROM times
WHERE map = @map
ORDER BY `time` ASC
LIMIT 1
在所有地图上找到最短时间,但前提是由某个玩家完成(查找给定玩家的所有世界纪录)
SELECT `time`
FROM times
WHERE name = @name
ORDER BY `time` ASC
LIMIT 1
【讨论】:
以上是关于MySQL:条件 MIN() 与 GROUP BY的主要内容,如果未能解决你的问题,请参考以下文章