Jika (sayangnya bernama) kolom Column_1
unik, Anda bisa melakukan:
WHERE Column_1 > :last_retrieved_value
Dari pertanyaan tersebut, terlihat bahwa Column_1
tidak unik, tetapi (Column_1,Column_2)
tupel itu unik.
Bentuk umum untuk kueri "halaman berikutnya", diurutkan berdasarkan dua kolom tersebut, menggunakan nilai yang diambil terakhir untuk kedua kolom tersebut, adalah...
(Column1,Column2) > (:lrv_col1,:lrv_col2)
(lrv =nilai yang disimpan dari baris terakhir yang diambil oleh kueri sebelumnya)
Untuk menulis kondisi itu di MySQL, kita bisa melakukannya seperti yang Anda tunjukkan:
WHERE t.Column_1 > :lrv_col1
OR ( t.Column_1 = :lrv_col1 AND t.Column_2 > :lrv_col2 )
Atau, kita bisa menulisnya seperti ini, yang saya lebih suka, karena kecil kemungkinan MySQL bingung dengan kondisi OR dan menggunakan indeks yang salah...
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
Untuk memperluasnya menjadi tiga kolom, untuk memeriksa kondisi...
(c1,c2,c3) > (:lrv1,:lrv2,:lrv3)
Kami menanganinya seperti dalam kasus dua kolom, menangani c1
pertama, pecahkan seperti dua kolom:
WHERE c1 >= :lrv1
AND ( c1 > :lrv1 OR ( ... ) )
ORDER BY c1, c2, c3
LIMIT n
Dan sekarang placeholder ...
(di mana baru saja memeriksa c2
sebelumnya, benar-benar lagi hanya kasus dua kolom. Kita perlu memeriksa:(c2,c3) > (lrv2,lrv3)
, sehingga kita dapat memperluasnya menggunakan pola yang sama:
WHERE c1 >= :lrv1
AND ( c1 > :lrv1 OR ( c2 >= :lrv2
AND ( c2 > :lrv2 OR c3 > :lrv3 )
)
)
ORDER BY c1,c2,c3
LIMIT n
Saya setuju bahwa ekspansi mungkin terlihat sedikit berantakan. Tapi itu mengikuti pola yang sangat teratur. Demikian pula, kita dapat menyatakan kondisi pada empat kolom...
(c1,c2,c3,c4) > (:lrv1,:lrv2,:lrv3,:lrv4)
Kami hanya mengambil apa yang kami miliki untuk tiga kolom, dan kami perlu memperluas c3 > :lrv3
untuk menggantinya dengan ( 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
Sebagai bantuan pembaca masa depan, saya akan mengomentari blok ini, dan menunjukkan maksudnya ...
-- (c1,c2,c3,c4) > (lr1,lr2,lr3,lr4)
Dan alangkah baiknya jika MySQL mengizinkan kita untuk mengungkapkan perbandingan begitu saja. Sayangnya, kami harus mengembangkannya menjadi sesuatu yang dipahami MySQL.