Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Dokładna paginacja z lewymi łączeniami

Oto Twoje oryginalne zapytanie

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 

Paginację wykonujesz na końcu. Jeśli dokonasz refaktoryzacji tego zapytania, możesz przeprowadzić paginację wcześniej.

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

Zauważ, że utworzyłem podzapytanie o nazwie k . 10 kluczy zostaje odebranych i zamówionych PIERWSZE !!!

Następnie JOIN mogą być kontynuowane, miejmy nadzieję, że przy użyciu zaledwie 10 identyfikatorów lokalizacji.

Co pomoże podzapytaniu k to indeks zawierający location_id i location_type_id

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

Oto coś, co może Ci się spodobać w tym podejściu

Jak zapytać o kolejne 10 identyfikatorów (identyfikatory 11 - 20)? Tak:

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

Wszystko, co musisz zrobić, to zmienić LIMIT klauzula w podzapytaniu k z każdą nową stroną.

  • LIMIT 20,10
  • LIMIT 30,10
  • i tak dalej...

Mogę poprawić refaktoryzację, usuwając tabelę lokalizacji i zlecając podzapytanie k przenosić potrzebne pola w następujący sposób:

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

Dodanie tego dodatkowego indeksu nie byłoby konieczne w tej wersji.

Spróbuj !!!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak rozwiązać błąd mysql portu 3306 na wampie?

  2. Jak połączyć się z serwerem MySQL na innym hoście?

  3. Uzyskaj ostatni rekord każdego miesiąca w MySQL....?

  4. Użycie Python3 mysqlclient-1.3.6 (aka PyMySQL)?

  5. Jak uzyskać ostatnio wstawiony identyfikator tabeli MySQL w PHP?