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

Bagaimana cara memilih semua catatan kecuali 3 catatan pertama?

Pada dasarnya Anda perlu memasukkan kueri tersebut ke prosedur tersimpan karena beberapa batasan pada LIMIT . Anda tidak dapat menggunakan sub pilih atau variabel dalam sql biasa. Dalam prosedur tersimpan Anda dapat menggunakan variabel.

Ini berfungsi, sayangnya saya tidak dapat menampilkannya di sqlfiddle karena mereka tampaknya memiliki dukungan terbatas untuk prosedur tersimpan.

drop procedure if exists all_but_3;

delimiter //
create procedure all_but_3()
begin
   declare v_max bigint unsigned default ~0;
   select * from your_table limit 3, v_max;
end//

delimiter ;

drop procedure if exists last_3;
delimiter //
create procedure last_3()
begin
   declare v_max bigint;
   declare v_mid bigint;
   select count(*) from your_table into v_max;
   set v_mid := v_max - 3;
   select * from your_table limit v_mid, v_max;
end//

delimiter ;

call all_but_3();
call last_3();

Elaborasi tentang Indeks Clustered InnoDB

Setelah berdiskusi di salah satu jawaban lain dengan @fthiella, saya memutuskan untuk menguraikan beberapa tentang cara kerjanya.

Tabel yang menggunakan InnoDB sebagai mesin akan selalu memiliki indeks berkerumun. Selalu. Begitulah cara data disimpan di InnoDB dan sama sekali tidak mungkin membuat tabel tanpa indeks berkerumun.

InnoDB akan memilih kunci utama jika ada satu atau indeks unik pertama dengan semua kolom disetel ke bukan nol. Jika tidak ada indeks seperti itu, InnoDB akan membuat kolom tersembunyi dengan id baris. Id baris ini berfungsi mirip dengan kenaikan otomatis dan jika itu membantu untuk menganggapnya sebagai kolom tak terlihat dengan kenaikan otomatis, saya pikir itu baik-baik saja.

Selanjutnya InnoDB akan mengembalikan baris sesuai dengan indeks yang digunakan. Itu akan selalu menggunakan beberapa indeks (satu-satunya cara untuk mengambil data adalah dengan menggunakan indeks sekunder, indeks berkerumun atau kombinasi) sehingga dalam kasus di mana tidak ada baris indeks yang dibuat secara eksplisit dikembalikan oleh indeks berkerumun tersembunyi.

Ini berarti bahwa kueri terhadap tabel tanpa kunci utama dan tanpa indeks unik dengan semua kolom disetel ke tidak nol dan tidak ada ORDER BY yang akan mengembalikan baris sesuai urutan penyisipannya.

Ini adalah kasus untuk pertanyaan ini dan dasar untuk jawaban saya dan banyak jawaban lainnya.

Saya tidak bermaksud mengatakan ini adalah cara yang baik untuk bekerja dengan data. Berikut adalah beberapa hal yang harus Anda pikirkan sebelum menggunakan solusi ini:

  • Jika indeks yang dapat digunakan sebagai indeks berkerumun pernah dibuat, tabel akan ditulis ulang untuk menggunakan indeks tersebut dan dengan demikian mengurutkan data pada disk. Jika indeks kemudian dijatuhkan, urutan penyisipan asli akan hilang dan tidak dapat diambil kembali.
  • Jika indeks dibuat, meskipun tidak unik, indeks tersebut dapat dipilih oleh pengoptimal untuk digunakan dan baris akan diurutkan oleh indeks tersebut.

Semua ini didokumentasikan dan untuk 5.5 ini adalah poin ke-3 di halaman ini



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PDO:Berikan fungsi MySQL ke bindValue/bindParam

  2. Bagaimana mengatasi Django.db.utils.IntegrityError:(1364, Bidang 'nama' tidak memiliki nilai default)

  3. gunakan pemicu yang sama untuk tabel yang berbeda

  4. Buat objek json bersarang menggunakan php mysql

  5. PHP - Kesalahan Sementara / Lain?