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 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)

【讨论】:

【参考方案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的主要内容,如果未能解决你的问题,请参考以下文章

mysql 子查询 group by的使用

【MySQL】分组查询(GROUP BY)

mysql 中order by 与group by的顺序

SQL Group By and min (MySQL)

GROUP BY和HAVING 以及mysql中常用的日期函数

怎么使用group by?