sql >> Databasteknik >  >> RDS >> Mysql

Exakt paginering med vänsterkopplingar

Här är din ursprungliga fråga

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 

Du utför sideringen sist. Om du refaktorerar den här frågan kan du utföra sideringen tidigare.

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

Observera att jag skapade en underfråga som heter k . De 10 nycklarna hämtas och beställs FÖRST!!!

Sedan kan JOINs fortsätta därifrån, hoppas att du använder bara 10 location_ids.

Vad hjälper underfrågan k är ett index som bär location_id och location_type_id

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

Här är något annat du kanske gillar med detta tillvägagångssätt

Hur frågar du efter de kommande 10 id (id 11 - 20)? Så här:

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

Allt du behöver göra är att ändra LIMIT sats i underfrågan k med varje ny sida.

  • LIMIT 20,10
  • LIMIT 30,10
  • och så vidare...

Jag kan förbättra refactoring genom att ta bort platstabellen och låta subquery k bära de nödvändiga fälten så här:

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

Att göra det extra indexet skulle inte vara nödvändigt för den här versionen.

Ge det ett försök !!!



  1. FEL 1148:Det använda kommandot är inte tillåtet med denna MySQL-version

  2. Hur man ansluter sql-utvecklare till XAMPP MYSQL-server

  3. Hur lagrar man väldigt gamla datum i databasen?

  4. Vad är skillnaden mellan cachePrepStmts och useServerPrepStmts i MySQL JDBC Driver