说我有一张表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
答案 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;