计算 mysql 中多列的最小值

Calculate a min over multiple columns in mysql

假设我有一个 table 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

这是没有 limit 1 的样子:

1   SIMPLE  events  ALL     NULL    NULL    NULL    NULL    640     Using filesort

这个怎么样?

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

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

注意:它只做 return 一条记录,即使有重复的记录。这似乎是你的意图。

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

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