mysql - 计算mysql中多列的最小值

标签 mysql group-by min

假设我有一个表events,如下所示

id    start   end
1     12:09   12:12
2     12:07   12:09
3     12:07   12:08

我想用最小的id获得最短的开始时间。这是我稍后需要该 id 来引用该行以检索 end 列的原因。

在此示例中,该时间为 (12:07, 2)。

我知道获得此值的一种方法是首先检索最小 start,然后获取其中的最小 id,如下所示:

select min (e.id) as minId from events as e 
join (
  select min (start) as minStart from events
) as x
where e.start = x.minStart
group by e.start

但是有没有办法将两者合而为一

(无子查询)?就像,

select min (start, id) as (minStart, minId) from events

显然不是这样,因为这不是有效的语法,但是本着这种精神?

后续

正如 Gordon 在下面建议的那样,当运行 order by start, id limit 1 时,mysql 确实使用索引。以下是包含 limit 1 时 EXPLAIN 的样子:

1   SIMPLE  events  index   NULL    startId     5   NULL    1   NULL

这是没有限制 1 的情况:

1   SIMPLE  events  ALL     NULL    NULL    NULL    NULL    640     Using filesort

最佳答案

这个怎么样?

select e.*
from events e
order by start_time, id
limit 1;

这将为您提供记录中的所有字段。

注意:即使存在重复项,它也只返回一条记录。这似乎是你的意图。

如果您想要最小 ID 的最大开始时间(这是示例数据建议的):

select e.*
from events e
order by start_time desc, id asc
limit 1;

关于mysql - 计算mysql中多列的最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29595985/

相关文章:

python - 如何在 Python 中使用 raw_input 附加列表并打印最小值和最大值

mysql - 在程序中授予权限

php - 获取从当前行到下一行mysql的datetime花费的时间

java Integer.MAX_VALUE、MIN_VALUE 溢出

sql - 如何在 Postgres 中获取时间间隔的平均值

c# - 具有动态列组的 LINQ GroupBy

prolog - 寻找最大最小值集

mysql - Access 表单级联组合框在下拉菜单中不显示任何内容

mysql - 再次mysql "count distinct"

mysql - 获取最接近按类型分组的特定日期的记录