sql >> Base de Datos >  >> RDS >> Mysql

Paginación precisa con uniones a la izquierda

Aquí está su consulta original

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 

Realiza la paginación en último lugar. Si refactoriza esta consulta, puede realizar la paginación antes.

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

Observe que creé una subconsulta llamada k . ¡Las 10 llaves se recogen y se piden PRIMERO!

Luego, los JOIN pueden continuar desde allí, con la esperanza de usar solo 10 ID de ubicación.

Lo que ayudará a la subconsulta k es un índice que lleva location_id y location_type_id

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

Aquí hay algo más que te puede gustar de este enfoque

¿Cómo consulta los próximos 10 ID (ID 11 - 20)? Así:

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

Todo lo que tienes que hacer es cambiar el LIMIT cláusula en la subconsulta k con cada nueva página.

  • LIMIT 20,10
  • LIMIT 30,10
  • y así sucesivamente...

Puedo mejorar la refactorización eliminando la tabla de ubicación y haciendo que la subconsulta k lleve los campos necesarios como este:

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

Hacer ese índice adicional no sería necesario para esta versión.

Pruébalo !!!