2013-04-23 3 views
0

나는 결과 세트에서 이전 ID와 다음 ID가 필요한 곳에서 mysql 쿼리를 작성하고있다. 나는 수색 질문없이 그것을 얻을 수 있었다. 그러나 검색을 할 때 ID는 분명 도움이되지 않습니다 ... 매개 변수를 기반으로하는 다른 필드가됩니다.MySQL의 복잡한 쿼리

그래서 두 개의 다른 쿼리를 실행합니다. 하나는 현재 사용자 ID 즉, 123이고 다른 하나는 이전 사용자 ID와 다음 사용자 ID입니다.

쿼리는 .... 이런 식으로 나는 사용자가 다음 ID를 이전하고 얻고있다 ...하지만 난 검색이 예를 들어 '존'에 갈 때, 나는 아니다 위의와 select fields from users where (( id = IFNULL((select min(id) from users where id > 123),0) or id = IFNULL((select max(id) from users where id < 123),0) ) AND (username like "%john%"))

입니다 검색 결과에서 다음 ID와 이전 ID를 얻을 수 있습니까? 또한 알파벳 정렬 A-Z와 Z-A도 있습니다. 그래서 나는 Asc라는 이름으로 Order라는 이름으로 정렬해야한다.

검색 결과 ID를 세션에 저장하는 것이 페이지 매기기 ID를 포함하여 좋은 아이디어입니까?

이것을 달성하기위한 옵션은 무엇입니까? 생각을 나누시겠습니까?

+0

이 질문과 유사합니다. 그것이 도움이 될 수 있으므로 저의 대답을 확인하십시오; http://stackoverflow.com/questions/16140208/using-sql-union-on-same-table-in-cakephp-find-query/16158060#16158060 – thaJeztah

답변

0

정렬하려는 다른 필드의 다음/이전 항목을 얻으려면 두 개의 별도 쿼리를 하나의 유니언에서 수행해야합니다.

SELECT ... 
FROM users 
WHERE whatever=whatever 
ORDER BY sortfield DESC limit 1,1 

UNION ALL 

SELECT .. 
FROM users 
WHERE whatever=whatever 
ORDER BY sortfield ASC LIMIT 1,1 

첫 번째 쿼리는 "이전"레코드를 얻습니다. 이전의 레코드는 실제로 정렬되는 것으로 정의됩니다. 다른 쿼리는 감각을 뒤집어서 같은 순서를 사용하여 순서가 뒤바뀐 (DESC -> ASC) "다음"레코드를 얻습니다.

이러한 쿼리 중 하나에서 LIMIT 0,1을 사용하면 실제 "현재"레코드가 결과 집합에도 포함될 수 있습니다. 그러나 두 가지 모두에서 그렇게하지 마십시오. 그렇지 않으면 노동 조합이 중복 된 "현재"를 일으킬 것입니다.