计算mysql中多列的最小值

时间:2015-04-12 23:45:14

标签: 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

以及没有limit 1

的情况
1   SIMPLE  events  ALL     NULL    NULL    NULL    NULL    640     Using filesort

2 个答案:

答案 0 :(得分:1)

这个怎么样?

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;

答案 1 :(得分:0)

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