sql >> Databáze >  >> RDS >> Mysql

Přesné stránkování s levými spoji

Zde je váš původní dotaz

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 

Stránkování provedete jako poslední. Pokud tento dotaz zrefaktorujete, můžete stránkování provést dříve.

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

Všimněte si, že jsem vytvořil poddotaz s názvem k . 10 klíčů bude vyzvednuto a objednáno PRVNÍ!!!

Pak mohou JOINy ​​pokračovat odtamtud, doufám, že použijete pouze 10 location_ids.

Co pomůže poddotazu k je index, který nese location_id a location_type_id

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

Zde je ještě něco, co by se vám na tomto přístupu mohlo líbit

Jak se dotážete na dalších 10 id (ids 11 - 20)? Takhle:

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

Jediné, co musíte udělat, je změnit LIMIT klauzule v poddotazu k s každou novou stránkou.

  • LIMIT 20,10
  • LIMIT 30,10
  • a tak dále...

Mohu zlepšit refaktoring odstraněním tabulky umístění a nechat poddotaz k nést potřebná pole takto:

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

Vytvoření tohoto extra indexu by pro tuto verzi nebylo nutné.

Vyzkoušejte to !!!



  1. doktrína - získat další a předchozí záznam

  2. Jak se připojím k PostgreSQL bez zadání názvu databáze?

  3. Příkaz SQL k vytvoření tabulky jako výsledek operace počítání?

  4. Nejlepší způsob, jak zabránit jedné osobě ve vytváření více účtů