Mysql
 sql >> Base de données >  >> RDS >> Mysql

Pagination précise avec jointures à gauche

Voici votre requête d'origine

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 

Vous effectuez la pagination en dernier. Si vous refactorisez cette requête, vous pouvez effectuer la pagination plus tôt.

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

Remarquez que j'ai créé une sous-requête appelée k . Les 10 clés sont récupérées et commandées EN PREMIER !!!

Ensuite, les JOIN peuvent continuer à partir de là, en espérant utiliser seulement 10 location_ids.

Qu'est-ce qui aidera la sous-requête k est un index qui contient location_id et location_type_id

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

Voici quelque chose d'autre que vous pourriez aimer à propos de cette approche

Comment interrogez-vous les 10 prochains identifiants (ids 11 - 20) ? Comme ceci :

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

Tout ce que vous avez à faire est de changer le LIMIT clause dans la sous-requête k à chaque nouvelle page.

  • LIMIT 20,10
  • LIMIT 30,10
  • et ainsi de suite...

Je peux améliorer la refactorisation en supprimant la table d'emplacement et en faisant en sorte que la sous-requête k porte les champs nécessaires comme ceci :

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

Faire cet index supplémentaire ne serait pas nécessaire pour cette version.

Essayez-le !!!