Mysql
 sql >> Database >  >> RDS >> Mysql

Impaginazione accurata con Join a sinistra

Ecco la tua domanda originale

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 

Esegui l'impaginazione per ultimo. Se esegui il refactoring di questa query, puoi eseguire l'impaginazione prima.

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

Nota che ho creato una sottoquery chiamata k . Le 10 chiavi vengono ritirate e ordinate PRIMA!!!

Quindi i JOIN possono continuare da lì, sperando di utilizzare solo 10 location_id.

Cosa aiuterà la sottoquery k è un indice che contiene location_id e location_type_id

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

Ecco qualcos'altro che potrebbe piacerti di questo approccio

Come si esegue una query per i prossimi 10 ID (ID 11 - 20)? In questo modo:

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

Tutto quello che devi fare è modificare il LIMIT clausola nella sottoquery k ad ogni nuova pagina.

  • LIMIT 20,10
  • LIMIT 30,10
  • e così via...

Posso migliorare il refactoring rimuovendo la tabella delle posizioni e fare in modo che la sottoquery k porti i campi necessari in questo modo:

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

Creare quell'indice aggiuntivo non sarebbe necessario per questa versione.

Provalo!!!