If (nešťastně pojmenovaný) sloupec Column_1
je jedinečný, můžete to udělat:
WHERE Column_1 > :last_retrieved_value
Z otázky vyplývá, že Column_1
není jedinečný, ale (Column_1,Column_2)
n-tice je jedinečný.
Obecný formulář pro dotaz „další stránka“ seřazený podle těchto dvou sloupců s použitím posledních načtených hodnot pro tyto dva sloupce by byl...
(Column1,Column2) > (:lrv_col1,:lrv_col2)
(lrv =hodnota uložená z posledního řádku načteného předchozím dotazem)
Chcete-li zapsat tuto podmínku v MySQL, můžeme to udělat, jak jste ukázali:
WHERE t.Column_1 > :lrv_col1
OR ( t.Column_1 = :lrv_col1 AND t.Column_2 > :lrv_col2 )
Nebo bychom to mohli napsat takto, čemuž dávám přednost, protože je mnohem menší šance, že se MySQL zmýlí podmínkou OR a použije nesprávný index...
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
Chcete-li to rozšířit na tři sloupců, pro kontrolu stavu...
(c1,c2,c3) > (:lrv1,:lrv2,:lrv3)
Řešíme to stejně jako v případě dvou sloupců, zpracováváme c1
nejprve jej rozdělte stejně jako dva sloupce:
WHERE c1 >= :lrv1
AND ( c1 > :lrv1 OR ( ... ) )
ORDER BY c1, c2, c3
LIMIT n
A teď ten zástupný symbol ...
(kde by byla pouze kontrola na c2
dříve, je ve skutečnosti opět jen dalším případem dvou sloupců. Musíme zkontrolovat:(c2,c3) > (lrv2,lrv3)
, takže to můžeme rozšířit pomocí stejného vzoru:
WHERE c1 >= :lrv1
AND ( c1 > :lrv1 OR ( c2 >= :lrv2
AND ( c2 > :lrv2 OR c3 > :lrv3 )
)
)
ORDER BY c1,c2,c3
LIMIT n
Souhlasím, že rozšíření může vypadat trochu chaoticky. Ale řídí se velmi pravidelným vzorem. Podobně bychom mohli vyjádřit podmínku na čtyři sloupce...
(c1,c2,c3,c4) > (:lrv1,:lrv2,:lrv3,:lrv4)
Vezmeme jen to, co máme pro tři sloupce, a musíme rozšířit c3 > :lrv3
nahradit jej řetězcem ( 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
Jako pomůcku pro budoucího čtenáře bych tento blok okomentoval a naznačil záměr ...
-- (c1,c2,c3,c4) > (lr1,lr2,lr3,lr4)
A bylo by hezké, kdyby nám MySQL umožnilo vyjádřit srovnání právě takto. Bohužel to musíme rozšířit na něco, čemu MySQL rozumí.