sql >> データベース >  >> RDS >> Mysql

複数の列を持つMySQLカーソルベースのページネーション

    (残念ながら名前が付けられた)列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が理解できるものに拡張する必要があります。




    1. SQLServer2005でのデッドロックの診断

    2. where句でのMySQL自動文字列から整数へのキャスト?

    3. シングルトンアプローチでのSQLiteメモリの問題

    4. Javaプログラムで呼び出すJavaストアドプロシージャ