计算 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;
假设我有一个 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;