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 !!!