Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Pagination berbasis kursor MySQL dengan banyak kolom

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara menghasilkan migrasi secara otomatis dengan Sequelize CLI dari model Sequelize?

  2. Apakah Diucapkan "S-Q-L" atau "Sekuel"?

  3. Hapus dari dua tabel dalam satu kueri

  4. Permintaan MySQL menemukan nilai dalam string yang dipisahkan koma

  5. Migrasi masalah dan pertanyaan MySQL UTF8 ke UTF8MB4