2012-04-11 3 views
3

есть правильный способ сделать это:Как получить «следующую строку» и «предыдущую строку» в наборе результатов, не выбрав весь набор результатов?

ID | name 
1 | aa 
4 | bb 
6 | dd 
9 | ee 

ID является первичным индексом с AUTO_INCREMENT ... отсутствуют индексы были удалены SQL, так что некоторые пустые пространства

если ориентироваться на странице? ID = 4 Я хочу получить предыдущую строку (с идентификатором 1) и следующую (с идентификатором 6) (добавлено :) по тому же запросу

есть способ сделать это, не выбирая/не перемещая весь набор результатов ?

благодарим вас заранее!

ответ

3
SELECT * from table where `ID` > 4 ORDER BY `ID` ASC LIMIT 1 /* next */ 
SELECT * from table where `ID` < 4 ORDER BY `ID` DESC LIMIT 1 /* previous */ 
+0

спасибо! есть ли способ сделать это в том же запросе? это потому, что запрос намного сложнее, и я не хочу выполнять его дважды, если это возможно! – skyline26

+0

Для этого требуются 'ORDER BY id ASC' и' ORDER BY id DESC', чтобы гарантировать, какая запись будет возвращена. – MatBailie

+1

@toPeerOrNotToPeer вы можете использовать UNION – safarov

3

Я хотел бы сделать что-то вроде этого (для предыдущей записи):

SELECT * FROM table 
WHERE id < @id 
ORDER BY id DESC 
LIMIT 1 

Это должно быть достаточно информации для двигателя DB для оптимизации запроса.

+0

спасибо! как насчет выбора как следующего, так и предыдущего в том же запросе? – skyline26

+2

UNION два запроса вместе, чтобы получить оба, и включить строку, как 'next' и 'prev', чтобы различать их. –

+0

спасибо @RoryHunter, что о выступлениях UNION? – skyline26

2

Дайте ему пытаясь угадать

(SELECT * FROM table_name 
WHERE id < 4 
ORDER BY id DESC 
LIMIT 1) 
union 
(SELECT * FROM table_name 
WHERE id > 4 
ORDER BY id ASC 
LIMIT 1) 
Смежные вопросы