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