2012-04-11 2 views
3

이 할 수있는 적절한 방법이 : 나는 페이지를 탐색하면 일부 빈 공간전체 결과 집합을 선택하지 않고 결과 집합에서 "다음 행"및 "이전 행"을 얻는 방법?

가 있도록

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

ID는 SQL에 의해 삭제 된 AUTO_INCREMENT ... 실종 인덱스가 기본 인덱스는? ID = 4 같은 쿼리를 사용하여 이전 행 (ID 1)과 다음 (ID 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

는 UNION – safarov

3

I (이전 레코드) 이런 짓을 할 것이다 :

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

하면 쿼리를 최적화 할 수있는 DB 엔진에 대한 충분한 정보되어야한다.

+0

감사하라! 같은 쿼리에서 다음과 이전을 모두 선택하는 것은 어떻습니까? – skyline26

+2

두 쿼리를 결합하여 두 쿼리를 구별하고 'next'및 'prev'와 같은 문자열을 구별하여 구별합니다. –

+0

감사합니다. @RoryHunter UNION의 공연은 어떻습니까? – skyline26

2

는 그것을

try-
(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) 
관련 문제