(残念ながら名前が付けられた)列Column_1
の場合 ユニークです、あなたはただすることができます:
WHERE Column_1 > :last_retrieved_value
質問から、Column_1
のようです 一意ではありませんが、(Column_1,Column_2)
タプルはユニークです。
「次のページ」クエリの一般的な形式は、これら2つの列で最後に取得された値を使用して、これら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がOR条件によって混乱し、間違ったインデックスを使用する可能性がはるかに少ないためです...
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
これを3に拡張するには 列、状態を確認するには...
(c1,c2,c3) > (:lrv1,:lrv2,:lrv3)
2列の場合と同じように処理し、c1
を処理します。 まず、2つの列のように分割します:
WHERE c1 >= :lrv1
AND ( c1 > :lrv1 OR ( ... ) )
ORDER BY c1, c2, c3
LIMIT n
そして今、そのプレースホルダー...
(c2
をチェックしただけの場所 以前は、実際には2列の別のケースです。チェックする必要があります:(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
拡張が少し厄介に見えるかもしれないことに同意します。しかし、それは非常に規則的なパターンに従います。同様に、 4で条件を表現できます。 列...
(c1,c2,c3,c4) > (:lrv1,:lrv2,:lrv3,:lrv4)
3つの列にあるものを取得し、 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が理解できるものに拡張する必要があります。