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

Phân trang chính xác với các phép nối bên trái

Đây là truy vấn ban đầu của bạn

SELECT l.location_id, l.location_name, 
       t.type_id, t.type_name, 
       i.location_address, i.location_phone 
FROM location AS l 
LEFT JOIN location_information AS i ON (l.location_id = i.location_id) 
LEFT JOIN location_types AS t ON (l.location_type_id = t.type_id) 
ORDER BY l.location_id DESC 
LIMIT 10 

Bạn thực hiện phân trang sau cùng. Nếu bạn cấu trúc lại truy vấn này, bạn có thể thực hiện phân trang sớm hơn.

SELECT l.location_id, l.location_name, 
       t.type_id, t.type_name, 
       i.location_address, i.location_phone 
FROM
    (SELECT location_id,location_type_id FROM location
    ORDER BY location_id LIMIT 10) AS k
    LEFT JOIN location AS l ON (k.location_id = l.location_id)
    LEFT JOIN location_information AS i ON (k.location_id = i.location_id) 
    LEFT JOIN location_types AS t ON (l.location_type_id = t.type_id) 
;

Lưu ý rằng tôi đã tạo một truy vấn con có tên là k . 10 chìa khóa được nhận và đặt hàng ĐẦU TIÊN !!!

Sau đó, các JOIN có thể tiếp tục từ đó, hy vọng chỉ sử dụng 10 location_ids.

Điều gì sẽ giúp ích cho truy vấn con k là một chỉ mục mang location_id và location_type_id

ALTER TABLE location ADD INDEX id_type_ndx (location_id,location_type_id);

Đây là điều khác mà bạn có thể thích về cách tiếp cận này

Làm cách nào để bạn truy vấn 10 id tiếp theo (id 11 - 20)? Như thế này:

SELECT l.location_id, l.location_name, 
       t.type_id, t.type_name, 
       i.location_address, i.location_phone 
FROM
    (SELECT location_id,location_type_id FROM location
    ORDER BY location_id LIMIT 10,10) AS k
    LEFT JOIN location AS l ON (k.location_id = l.location_id)
    LEFT JOIN location_information AS i ON (k.location_id = i.location_id) 
    LEFT JOIN location_types AS t ON (l.location_type_id = t.type_id) 
;

Tất cả những gì bạn phải làm là thay đổi LIMIT mệnh đề trong truy vấn con k với mỗi trang mới.

  • LIMIT 20,10
  • LIMIT 30,10
  • và v.v. ...

Tôi có thể cải thiện cấu trúc lại bằng cách xóa bảng vị trí và yêu cầu truy vấn con k mang các trường cần thiết như sau:

SELECT k.location_id, k.location_name, 
       t.type_id, t.type_name, 
       i.location_address, i.location_phone 
FROM
    (SELECT location_id,location_type_id,location_name
    FROM location ORDER BY location_id LIMIT 10,10) AS k
    LEFT JOIN location_information AS i ON (k.location_id = i.location_id) 
    LEFT JOIN location_types AS t ON (k.location_type_id = t.type_id) 
;

Việc tạo chỉ mục bổ sung đó sẽ không cần thiết cho phiên bản này.

Hãy thử !!!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách sử dụng câu lệnh CASE trong MySQL

  2. Truy vấn MySQL tương đương với dải_tag PHP là gì?

  3. mySQL Trở lại top 5 của mỗi danh mục

  4. Mysql + php với các ký tự đặc biệt như '(Apostrophe) và (Dấu ngoặc kép)

  5. MySQL:Bạn gặp lỗi trong cú pháp SQL của mình ... gần 'mô tả) GIÁ TRỊ (' Ý tưởng ',' Mô tả ')'