Ако (назованата за съжаление) колона Column_1
е уникален, можете просто да направите:
WHERE Column_1 > :last_retrieved_value
От въпроса изглежда, че Column_1
не е уникален, но (Column_1,Column_2)
кортежът е уникален.
Общата форма за заявка "следваща страница", подредена по тези две колони, като се използват последните извлечени стойности за тези две колони, би била...
(Column1,Column2) > (:lrv_col1,:lrv_col2)
(lrv =стойност, запазена от последния ред, извлечен от предишната заявка)
За да запишем това условие в MySQL, можем да направим това, както сте показали:
WHERE t.Column_1 > :lrv_col1
OR ( t.Column_1 = :lrv_col1 AND t.Column_2 > :lrv_col2 )
Или можем да го напишем така, което предпочитам, защото има много по-малък шанс MySQL да се обърка от условието ИЛИ и да използва грешен индекс...
WHERE t.Column_1 >= :lrv_col1
AND ( t.Column_1 > :lrv_col1 OR t.Column_2 > :lrv_col2 )
ORDER BY t.Column_1, t.Column_2
LIMIT n
За да разширите това до три колони, за да проверите условието...
(c1,c2,c3) > (:lrv1,:lrv2,:lrv3)
Ние се справяме точно както в случая с две колони, обработвайки c1
първо, разбивайки го точно както двете колони:
WHERE c1 >= :lrv1
AND ( c1 > :lrv1 OR ( ... ) )
ORDER BY c1, c2, c3
LIMIT n
И сега този заместител ...
(къде щеше да има само проверката на c2
преди, наистина отново е просто още един случай на две колони. Трябва да проверим:(c2,c3) > (lrv2,lrv3)
, така че можем да го разширим, като използваме същия модел:
WHERE c1 >= :lrv1
AND ( c1 > :lrv1 OR ( c2 >= :lrv2
AND ( c2 > :lrv2 OR c3 > :lrv3 )
)
)
ORDER BY c1,c2,c3
LIMIT n
Съгласен съм, че разширението може да изглежда малко разхвърляно. Но тя следва много редовен модел. По същия начин бихме могли да изразим условието на четири колони...
(c1,c2,c3,c4) > (:lrv1,:lrv2,:lrv3,:lrv4)
Просто вземаме това, което имаме за трите колони, и трябва да разширим c3 > :lrv3
за да го замените с ( c3 >= :lrv3 AND ( c3 > :lrv3 OR c4 > :lrv4 ) )
WHERE c1 >= :lrv1
AND ( c1 > :lrv1 OR ( c2 >= :lrv2
AND ( c2 > :lrv2 OR ( c3 >= :lrv3
AND ( c3 > :lrv3 OR c4 > :lrv4 )
)
)
)
)
ORDER BY c1,c2,c3,c4
LIMIT n
Като помощ на бъдещия читател, бих коментирал този блок и бих посочил намерението ...
-- (c1,c2,c3,c4) > (lr1,lr2,lr3,lr4)
И би било хубаво MySQL да ни позволи да изразим сравнението точно така. За съжаление, трябва да разширим това в нещо, което MySQL разбира.