Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Phân trang dựa trên con trỏ MySQL với nhiều cột

Nếu (không may được đặt tên) cột Column_1 là duy nhất, bạn chỉ có thể làm:

 WHERE Column_1 > :last_retrieved_value

Từ câu hỏi, có vẻ như Column_1 không phải là duy nhất, mà là (Column_1,Column_2) tuple là duy nhất.

Dạng chung cho truy vấn "trang tiếp theo", sắp xếp theo hai cột đó, sử dụng các giá trị được truy xuất cuối cùng cho hai cột đó, sẽ là ...

    (Column1,Column2) > (:lrv_col1,:lrv_col2)

(lrv =giá trị được lưu từ hàng cuối cùng được truy xuất bởi truy vấn trước đó)

Để viết điều kiện đó trong MySQL, chúng tôi có thể làm như bạn đã trình bày:

 WHERE t.Column_1 > :lrv_col1
    OR ( t.Column_1 = :lrv_col1 AND t.Column_2 > :lrv_col2 )

Hoặc, chúng tôi có thể viết nó như thế này, tôi thích hơn, vì ít có cơ hội để MySQL bị nhầm lẫn bởi điều kiện OR và sử dụng chỉ mục sai ...

 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

Để mở rộng điều đó thành ba cột, để kiểm tra điều kiện ...

  (c1,c2,c3) > (:lrv1,:lrv2,:lrv3)

Chúng tôi xử lý nó giống như trong trường hợp hai cột, xử lý c1 trước tiên, hãy chia nhỏ nó ra giống như hai cột:

 WHERE c1 >= :lrv1
       AND ( c1 > :lrv1 OR ( ... ) )
 ORDER BY c1, c2, c3
 LIMIT n

Và bây giờ trình giữ chỗ đó ... (ở đâu chỉ cần kiểm tra c2 trước đây, thực sự chỉ là một trường hợp khác của hai cột. Chúng ta cần kiểm tra:(c2,c3) > (lrv2,lrv3) , vì vậy chúng tôi có thể mở rộng điều đó bằng cách sử dụng cùng một mẫu:

 WHERE c1 >= :lrv1
       AND ( c1 > :lrv1 OR ( c2 >= :lrv2 
                             AND ( c2 > :lrv2 OR c3 > :lrv3 )
                           )
           )
 ORDER BY c1,c2,c3
 LIMIT n

Tôi đồng ý rằng việc mở rộng có thể trông hơi lộn xộn. Nhưng nó tuân theo một mô hình rất thường xuyên. Tương tự, chúng tôi có thể thể hiện điều kiện trên bốn cột ...

 (c1,c2,c3,c4) > (:lrv1,:lrv2,:lrv3,:lrv4)

Chúng tôi chỉ lấy những gì chúng tôi có cho ba cột và chúng tôi cần mở rộng c3 > :lrv3 để thay thế nó bằng ( 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

Để hỗ trợ người đọc trong tương lai, tôi sẽ nhận xét khối này và cho biết mục đích ...

 -- (c1,c2,c3,c4) > (lr1,lr2,lr3,lr4)

Và sẽ thật tuyệt nếu MySQL cho phép chúng ta thể hiện sự so sánh như vậy. Thật không may, chúng tôi phải mở rộng điều đó thành một thứ mà MySQL hiểu được.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nhóm ngày giờ của MySQL thành các khoảng thời gian bất kể múi giờ

  2. Sử dụng LIMIT 1 trong MySQL

  3. Làm cách nào để thoát dấu gạch dưới trong truy vấn chuỗi ở chế độ ngủ đông và SQL?

  4. Thiết lập cơ sở dữ liệu lớn trong MySQL để phân tích trong R

  5. Làm thế nào để lặp qua một mảng các đầu vào trong một biểu mẫu?