Написать (под)запрос в БД MySQL

Рейтинг: 1Ответов: 2Опубликовано: 10.02.2015

Здравствуйте.

Помогите правильно составить запрос в БД MySQL. Мне нужно из последних 600 записей вытащить 4 последних.
SELECT * FROM таблица ORDER BY DESC id LIMIT 600;
Я понимаю, что это делается через подзапрос, но как его написать, не знаю.

Ответы

▲ 3Принят

Еще раз - если надо выбрать 4 последние записи из 600, то надо просто сделать LIMIT 596, 4, но если вам так уж необходимо именно через подзапрос сделать, тогда вот вам вариант:

SELECT *
FROM `table_name`

INNER JOIN (
    SELECT id
    FROM `table_name`
    ORDER BY DESC id LIMIT 600
) as t
USING (id)

ORDER BY id ASC
LIMIT 4

В таком случае внутренний select будет работать с индексом, т.е. очень быстро выберет id и по нему опять применит индекс для того, чтобы выбрать записи из исходной таблицы.

Здесь можете сравнить планы выполнения трех способов. Привел примеры несколько измененных запросов, чтобы мои запросы отображали тот же результат, что и запрос тов. @argamidon. Обратите внимание на количество затронутых строк и тип доступа к таблицам

▲ 2
select * from (select * from table_name as inner_table order by id desc) as b2 limit 4

Вообще-то полагаться на ID как на ключ, сообщающий, "кто был последний, а кто первый", - это очень очень плохо. ID не сообщает о том, кто был вставлен раньше, а кто позже. Используйте для этого триггер с таблицей-аудитом, в которую будет заносится реальное время вставки/обновления строки.