2012-05-26 3 views
0

내 웹 사이트에 사진 갤러리가 있고 다음/이전 버튼을 구현하고 싶습니다. 일단 데이터베이스 끝에 도달하면 첫 번째 사진으로 다시 전송됩니다.MySQL의 다음 & 이전 기록 문제

다음 버튼에서 작동하는 MYSQL 쿼리가 있는데 문제는 이전 것입니다. 다음 버튼과 같은 코드를 사용합니다 (값을 변경하여 작동하게 함).하지만 내 데이터베이스의 첫 번째 항목에 머물러 있습니다.

나는 자동 증가 필드 인 id 필드를 사용하여 목록을 정렬합니다.

SELECT * 
FROM photos 
WHERE 
     id = (SELECT MIN(id) FROM photos WHERE status = '0' AND id > ".$id.") 
     OR id = (SELECT MIN(id) FROM photos WHERE status = '0') 
LIMIT 1 

는 $ id 변수가 현재 사진 ID입니다 :이 작동하지 않는 이전에 내 코드

SELECT * 
FROM photos 
WHERE 
     id = (SELECT MAX(id) FROM photos WHERE status = '0' AND id < ".$id.") 
     OR id = (SELECT MAX(id) FROM photos WHERE status = '0') 
LIMIT 1 

입니다 :

이 다음에 내 코드입니다.

나는 많은 다음/이전 질문을 알고 있지만 그 어떤 도움도 찾지 못했습니다.

+0

두 개가 섞여 있다고 생각합니다. 첫 번째 쿼리는 NEXT에 대한 것이고 두 번째 쿼리는 PREVIOUS에 대한 쿼리 여야합니다. – JHS

답변

0

WHERE 절의 두 번째 OR 피연산자에서 문제가 발생합니다. 결과 집합 내의 현재 위치와 관계없이 첫 번째/마지막 사진을 두 쿼리에 모두 포함합니다. MySQL은 ORDER BY 절이 지정되지 않은 경우 결과가 반환되는 순서에 대해 어떠한 보증도하지 않으므로 첫 번째 항목이 원하는 이전 항목보다 먼저 주문되므로 LIMIT 절이 반환되는 항목 만 반환됩니다.

당신은 각각 ORDER BY id DESCORDER BY id ASC을 지정하여이 문제를 해결할 수 있지만, 이러한 테스트는 정말 어떤 결과가 — 그래서 난 완전히 그 피연산자를 제거 권하고 싶습니다 반환 여부에 따라 응용 프로그램 내에서 일어날해야한다.

당신은 다음에 대한 쿼리를 단순화 할 수 있습니다 :

SELECT * 
FROM  photos 
WHERE status = 0 AND id < $id 
ORDER BY id DESC 
LIMIT 1 

그리고 이전에 대한을 :

SELECT * 
FROM  photos 
WHERE status = 0 AND id > $id 
ORDER BY id ASC 
LIMIT 1 

(이것은 실제로 낮은 함께 사진을 얻기 위해 "다음"하셨을까 가정 id, 그리고 "이전"은 더 높은 것 하나를 얻으려면 id, 그렇지 않으면 두 쿼리를 교환하십시오).

+0

좋아,이 모든 것을 이해했지만 데이터베이스의 끝에 도달하면 처음으로 돌아가서 루프를 돌리고 싶습니다. 그것은 내가 일하는 것을 얻지 못하는 유일한 부분입니다. –

+0

@ JorisBlanc : 애플리케이션에서 로직을 구현하십시오. 예를 들어 위의 쿼리에서 결과가 반환되지 않으면 loop-around 항목을 찾기 위해 최대/최소 ID를 적절히 '선택'하십시오. – eggyal

+0

이것은 내가 생각한 것입니다. 그러나 일종의'if'와'else'를 사용하여 하나의 쿼리를 수행하는 방법이 있습니다. 아니면 그냥 if ... else 문을 사용해야합니다. –