Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Pagination Akurat dengan Gabung kiri

Ini kueri asli Anda

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 

Anda melakukan pagination terakhir. Jika Anda memfaktorkan ulang kueri ini, Anda dapat melakukan pagination lebih awal.

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

Perhatikan saya membuat subquery bernama k . 10 kunci diambil dan dipesan PERTAMA !!!

Kemudian JOIN dapat dilanjutkan dari sana, semoga hanya menggunakan 10 lokasi_id.

Apa yang akan membantu subkueri k adalah indeks yang membawa location_id dan location_type_id

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

Berikut adalah hal lain yang mungkin Anda sukai tentang pendekatan ini

Bagaimana Anda meminta 10 id berikutnya (id 11 - 20)? Seperti ini:

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

Yang harus Anda lakukan adalah mengubah LIMIT klausa dalam subquery k dengan setiap halaman baru.

  • LIMIT 20,10
  • LIMIT 30,10
  • dan seterusnya...

Saya dapat meningkatkan pemfaktoran ulang dengan menghapus tabel lokasi dan meminta subquery k membawa bidang yang diperlukan seperti ini:

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

Membuat indeks ekstra itu tidak diperlukan untuk versi ini.

Cobalah !!!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Muat data dari CSV ke database mySQL Java+hibernate+spring

  2. Apa itu INDEKS SPASIAL dan kapan saya harus menggunakannya?

  3. Menyisipkan &Bergabung dengan MySQL

  4. Apa cara terbaik untuk menangani sesi untuk situs PHP di banyak host?

  5. Logis DAN operator di mySql REGEXP?