Đâ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ử !!!