2015-04-12 49 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;