2015-04-12 65 views
0

说我有一个表events,看起来像这样计算在MySQL在多个列的分

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 

显然不是因为这是不正确的语法,但在这种精神?

后续

戈登以下建议,运行order by start, id limit 1时,MySQL的使用索引。下面介绍一下EXPLAIN长相当包括limit 1,如:

1 SIMPLE events index NULL startId  5 NULL 1 NULL 

,这里是什么样子没有limit 1

1 SIMPLE events ALL  NULL NULL NULL NULL 640  Using filesort 
+0

最小启动时间ID将是(1 12:05 )。 –

+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; 
+0

如果我想通过start,id'来执行命令,那么您认为我应该在桌面上使其有效吗? mysql是否使用索引来执行命令?对于限制1的订单,它会很聪明,还是通常只对整个表进行排序,然后将其限制为1? –

+0

添加ID以订购 –

+0

@ChrisMiddleton。 。 。你可以在'events(start_time,id)'上使用索引。 –

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