カーソルベースのページ番号を使用してクエリを実行するテーブルがありますが、複数の列を適用する必要があります。複数の列を持つMySQLカーソルベースのページ番号
はのは、2つのカラムを使用しての簡単な例を見てみましょう - 私はこのような最初のページの取得:
SELECT column_1, column_2
FROM table_name
ORDER BY column_1, column_2
LIMIT 10
私は結果を取得した後、私は最後の行に基づいて、次のページを取得することができます。最後の行がcolumn_1 = 5, column_2 = 8
であったとします。私はこのようなことをしたい:
SELECT column_1, column_2
FROM table_name
WHERE column_1 > 5 AND column_2 > 8
ORDER BY column_1, column_2
LIMIT 10
これは明らかに間違っている。それは私がこの問題を回避するために、このような何かを行うことができます(なぜならcolumn_2
上のフィルタの)
を(なぜならcolumn_1
上のフィルタの)column_1 = 5, column_2 = 9
を持っている行またはcolumn_1 = 6, column_2 = 6
を持つ行を除外します:
SELECT column_1, column_2
FROM table_name
WHERE column_1 > 5
OR (column_1 = 5 AND column_2 > 8)
ORDER BY column_1, column_2
LIMIT 10
しかし、これは非常に面倒で2つの以上の列の発生しやすいエラーになり...また
は、私のユースケースは、複数の種類(INT UNSIGNED
とBINARY
)の列が含まれていますが、すべてが同等である
ご意見はありますか?
ありがとうございます!
詳細な回答ありがとうございます! 私はシンプルな "タプル"比較を試してみましたが、それは機能しました(MySQL 5.6)。いくつかの 'EXPLAIN'クエリを実行して、拡張バージョンよりも優れているかどうかを確認しようとしています... – amitayh
Ha!私はMySQLがそのタプル比較構文をサポートしていることを知らなかった!それは展開よりもはるかに簡単だろう。 '(c1、c2、c3)>(r1、r2、r3)'。はい、EXPLAINプランをチェックしてください... MySQLがインデックス範囲スキャン操作を使用し、c1、c2、c3を先頭の列として使用したいと考えています。 – spencer7593