Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Genaue Paginierung mit linken Joins

Hier ist Ihre ursprüngliche Anfrage

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 

Die Paginierung führen Sie zuletzt durch. Wenn Sie diese Abfrage umgestalten, können Sie die Paginierung früher durchführen.

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) 
;

Beachten Sie, dass ich eine Unterabfrage namens k erstellt habe . Die 10 Schlüssel werden ERST abgeholt und bestellt !!!

Dann können die JOINs von dort aus weitergehen, hoffentlich mit nur 10 location_ids.

Was hilft der Unterabfrage k ist ein Index, der location_id und location_type_id enthält

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

Hier ist noch etwas, das Ihnen an diesem Ansatz gefallen könnte

Wie fragen Sie nach den nächsten 10 IDs (IDs 11 - 20)? So:

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) 
;

Alles, was Sie tun müssen, ist das LIMIT zu ändern -Klausel in der Unterabfrage k mit jeder neuen Seite.

  • LIMIT 20,10
  • LIMIT 30,10
  • und so weiter...

Ich kann das Refactoring verbessern, indem ich die Standorttabelle entferne und die Unterabfrage k die erforderlichen Felder wie folgt tragen lässt:

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) 
;

Das Erstellen dieses zusätzlichen Index wäre für diese Version nicht erforderlich.

Probieren Sie es aus !!!