2015-04-12 3 views
0

Скажем, у меня есть таблица events, которая выглядит, как этотВычислить мин через несколько столбцов в MySQL

id start end 
1  12:09 12:12 
2  12:07 12:09 
3  12:07 12:08 

Я хочу, чтобы получить минимальное время запуска с минимальным идентификатором. Причина, по которой мне нужен идентификатор для ссылки на строку позже, чтобы получить столбец 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

Минимальное время запуска с идентификатором будет (1, 12:05). –

+0

@ Gordon Ой, я исправлю это. –

ответ

1

Как об этом?

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

Это дает вам все поля в записи.

Примечание: оно возвращает только одну запись, даже если есть дубликаты. Кажется, это ваше намерение.

Если вы хотите максимальное время запуска с минимальным идентификатором (который является то, что предлагает образец данных):

select e.* 
from events e 
order by start_time desc, id asc 
limit 1; 
+0

Если бы я хотел сделать «порядок по началу, id», был бы какой-то индекс, как вы думаете, я должен был бы на столе сделать его эффективным? Использует ли mysql индекс для выполнения заказа? Было бы разумно относиться к порядку по лимиту 1, или обычно ли это просто какая-то таблица, а затем ограничивает ее на 1? –

+0

Добавить идентификатор на заказ от –

+0

@ChrisMiddleton. , , Вы бы использовали индекс в 'events (start_time, id)'. –

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