Как выбрать предыдущую или следующую строку, упорядоченную по нескольким текстовым столбцам - PullRequest
0 голосов
/ 21 сентября 2011

У меня есть форма для редактирования столбцов таблицы MySQL. Есть ссылки, по которым я могу перейти и загрузить строку «Предыдущая», «Следующая», «Первая» или «Последняя». Я могу заказать столбцы (макс. Четыре столбца для заказа). Поэтому, когда я нажимаю Prev. или Далее, столбцы должны быть упорядочены в первую очередь, а затем я могу получить результат. Я использую MySQL для этого. Важно знать, что столбцы - это текст, а 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  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

Я попытался расширить это, чтобы найти несколько столбцов, как это:

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

Но это не дает результатов.

Отредактировано:

Я пытался написать запрос для случая, когда фактический идентификатор строки равен 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`))

И (х. typ <у. <code>typ ИЛИ (х. typ = у. typ И х. id <у. <code>id) ИЛИ (х. typ = у. typ И у. id = 1 И х. id> у. id)) А ТАКЖЕ (х. diff <у. <code>diff ИЛИ (х. diff = у. diff И х. id <у. <code>id) ИЛИ (х. diff = у. diff И у. id = 1 И х. id> у. id)) ГДЕ у. id = 1 ЗАКАЗАТЬ ПО Х. cat DESC, Х. typ DESC, Х. diff DESC, Х. id DESC LIMIT 0,1

Это выглядит для предыдущего ряда. Поведение немного странно, но работает. Поэтому, когда я перехожу к последнему значению, я получаю id = 1. Затем, когда я нажимаю Previous (этот запрос), он получает id = 82, когда я снова нажимаю Previous id = 81 и так далее, пока я не получу id = 2. Я не могу получить id = 1, только когда нажимаю / выбираю Last.

1 Ответ

0 голосов
/ 21 сентября 2011
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

Проблема с этим запросом, которую я вижу, состоит в том, что идентификатор не может быть меньше 1.
Так что x.id < y.id всегда будет ложным.
Это оставляет только

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

В качестве критерия объединения.

...