2011-09-21 4 views
0

mysql 테이블 열을 편집 할 수있는 양식이 있습니다. 링크를 클릭하여 이전, 다음, 처음 또는 마지막 행을로드 할 수 있습니다. 열을 정렬 할 수 있습니다 (최대 4 열을 주문할 수 있음). 그래서 내가 Prev. 또는 다음으로 열을 먼저 정렬 한 다음 결과를 얻을 수 있습니다. 나는 이것을 위해 MySQL View를 사용한다. 열은 텍스트이지만 id는 숫자라는 것을 아는 것이 중요합니다. 나는 일반적으로 첫 번째 텍스트 열을 기준으로 정렬 한 다음 ID를 기준으로 정렬합니다.여러 텍스트 열 순서로 이전 또는 다음 행을 선택하는 방법

그리고 단일 열 순서에 대해 저에게 도움이되는 쿼리가 있습니다. 이전

:

SELECT x.* 
    FROM test_view x, test_view y 
    WHERE y.`id` = 13 
      AND (x.`cat` < y.`cat` OR (x.`cat` = y.`cat` AND x.`id` < y.`id`)) 
ORDER BY x.`cat`, x.`id` DESC 
    LIMIT 0,1 

다음 :

SELECT x . * 
FROM ukazka_view x, ukazka_view y 
WHERE y.`id` =1 
AND (
x.`cat` < y.`cat` 
OR (
x.`cat` = y.`cat` 
AND x.`id` < y.`id` 
) 
) 
AND (
x.`typ` < y.`typ` 
OR (
x.`typ` = y.`typ` 
AND x.`id` < y.`id` 
) 
) 
AND (
x.`diff` < y.`diff` 
OR (
x.`diff` = y.`diff` 
AND x.`id` < y.`id` 
) 
) 
ORDER BY x.`cat` DESC , x.`typ` DESC , x.`diff` DESC , x.`id` DESC 
LIMIT 0 , 1 

을하지만이 결과가 없습니다 :

SELECT x.* 
    FROM test_view x, test_view y 
    WHERE y.`id` = 13 
      AND (x.`cat` > y.`cat` OR (x.`cat` = y.`cat` AND x.`id` > y.`id`)) 
ORDER BY x.`cat`, x.`id` ASC 
    LIMIT 0,1 

나는이 같은 여러 열을 찾으려면이 확장했습니다.

편집 됨 :..

I 실제 행 ID 1.

SELECT x.* FROM ukazka_view x INNER JOIN ukazka_view y ON 
(x.`cat` < y.`cat` OR 
(x.`cat` = y.`cat` AND x.`id` < y.`id`) OR 
(x.`cat` = y.`cat` AND y.`id` = 1 AND x.`id` > y.`id`)) 

AND (X typ < Y typ OR (X 인 경우에 대한 쿼리를 작성하려고 typ. = y. typ AND x. id <y. id) 또는 (x. typ = y. typ 그리고 y. id = 1 AND x. id> y. id)) AND (X. diff < Y. diff OR (X. diff = Y. diff AND X. id < Y. id) OR (X. diff = Y. diff AND Y. id = 1 AND x. id> y. id)) 어디 y. id = 1 주문 x. cat DESC, x. typ DESC, x. diff DESC, x. id DESC LIMIT 0,1

이전 행을 찾습니다. 행동은 조금 이상하지만 작동합니다. 그래서 마지막 값으로 갈 때, 나는 id = 1을 얻었습니다. 그런 다음 Previous (이 쿼리)를 누르면 id = 82가됩니다. 이전 id = 81 등을 다시 누르면 id = 2가됩니다. 나는 Last를 누르거나 선택했을 때만 id = 1로 갈 수 없다.

+0

암시 적 조인은 anti-pattern입니다. 명시 적 조인을 사용하고 1989 년을 빠져 나가는 것이 좋습니다. – Johan

+0

첫 번째 두 코드는 SQL을 훨씬 잘 이해하는 사람이 나에게주었습니다. 나는 초보자 일 뿐이므로 귀하의 의견을 이해할 수 없습니다. 또한 처음 두 코드는 우리나라에서 매우 좋은 평판을 얻은 한 사이트의 예에서 가져온 것입니다. – Joe

+0

암시 적 조인의 문제점은 필터와 조인 기준을 혼합한다는 것입니다. 이것은 나쁘고 혼란스럽고 이런 이유로 명시 적 조인 구문은 아래 답변을 참조하십시오. 1992 년에 발명되었습니다 (!). 여기서는 조인 기준이 별도로 나열됩니다. 쿼리를 훨씬 명확하고 쉽게 디버깅 할 수 있습니다. 그렇지 않으면 동일하게 작동합니다. – Johan

답변

0
SELECT x.* 
FROM ukazka_view x 
INNER JOIN ukazka_view y 
    ON (x.cat < y.cat OR (x.cat = y.cat AND x.id < y.id)) 
    AND (x.typ < y.typ OR (x.typ = y.typ AND x.id < y.id)) 
    AND (x.diff < y.diff OR (x.diff = y.diff AND x.id < y.id)) 
WHERE y.id = 1 
ORDER BY x.cat DESC , x.typ DESC , x.diff DESC , x.id DESC 
LIMIT 1 OFFSET 0 

내가이 쿼리와 함께 볼 수있는 문제는 ID가 1보다 작다
그래서 x.id < y.id는 항상 false 될 것입니다하지 않을 수 있다는 것입니다.
에만

.... 
    ON (x.cat < y.cat) 
    AND (x.typ < y.typ) 
    AND (x.diff < y.diff) 

조인 기준으로 떠난다.

+1

'(x.cat

+0

@ypercube, 와우 어디에서 보석을 가져 왔습니까? 이 동작을 문서화하는 링크를 갖고 싶습니다. – Johan

+0

@Johan : "이 쿼리에서 볼 수있는 문제는 ID가 1보다 작을 수 없다는 것입니다." - 문제의 두 가지 첫 번째 코드가 작동하지 않아야 함을 의미합니까? 지금 코드를 테스트했는데 제대로 작동하는 것 같습니다. 이 순간 나는 First and Last와 함께 작업하도록 코드를 수정하려고합니다. 이 코드는 고맙습니다. – Joe

관련 문제