Saya memiliki pertanyaan yang terlihat seperti ini:
SELECT article FROM table1 ORDER BY publish_date LIMIT 20
Bagaimana cara ORDER BY berfungsi? Apakah akan memesan semua catatan, lalu mendapatkan 20 yang pertama, atau akankah mendapatkan 20 catatan dan memesannya di publish_date
lapangan?
Jika yang terakhir, Anda tidak dijamin benar-benar mendapatkan 20 artikel terbaru.
mysql
sql
sql-order-by
sql-limit
Alex
sumber
sumber
publish_date
s sama, memesan oleh mereka tidak memberikan hasil yang menentukan, artinya jika Anda menggunakanLIMIT
untuk pagination, Anda mungkin mendapatkan item yang sama di halaman yang berbeda!Jawaban:
Ini akan memesan pertama, lalu mendapatkan 20. Database pertama juga akan memproses apa pun dalam
WHERE
klausa sebelumnyaORDER BY
.sumber
LIMIT
istirahatORDER BY
. DenganLIMIT
sebuahORDER BY
hasil pengembalian yang salah.LIMIT
entah bagaimana mengatur ulang hasil yang disetel dikembalikan olehORDER BY
Klausa LIMIT dapat digunakan untuk membatasi jumlah baris yang dikembalikan oleh pernyataan SELECT. LIMIT mengambil satu atau dua argumen numerik, yang keduanya harus berupa konstanta integer nonnegatif (kecuali ketika menggunakan pernyataan yang disiapkan).
Dengan dua argumen, argumen pertama menentukan offset dari baris pertama untuk kembali, dan argumen kedua menentukan jumlah maksimum baris untuk kembali. Offset baris awal adalah 0 (bukan 1):
SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15
Untuk mengambil semua baris dari offset tertentu hingga akhir set hasil, Anda dapat menggunakan sejumlah besar untuk parameter kedua. Pernyataan ini mengambil semua baris dari baris ke-96 ke baris terakhir:
SELECT * FROM tbl LIMIT 95,18446744073709551615;
Dengan satu argumen, nilai menentukan jumlah baris yang akan dikembalikan dari awal set hasil:
SELECT * FROM tbl LIMIT 5; # Retrieve first 5 rows
Dengan kata lain, LIMIT row_count setara dengan LIMIT 0, row_count.
Semua detail tentang: http://dev.mysql.com/doc/refman/5.0/id/select.html
sumber
Seperti yang dikatakan @James, ia akan memesan semua catatan, lalu mendapatkan 20 baris pertama.
Karena itu, Anda dijamin mendapatkan 20 artikel pertama yang diterbitkan, yang lebih baru tidak akan ditampilkan.
Dalam situasi Anda, saya sarankan Anda tambahkan
desc
keorder by publish_date
, jika Anda ingin artikel terbaru, maka artikel terbaru akan menjadi yang pertama.Jika Anda perlu menjaga hasil dalam urutan menaik, dan masih hanya ingin 10 artikel terbaru, Anda dapat meminta mysql untuk mengurutkan hasil Anda dua kali.
Kueri ini di bawah ini akan mengurutkan hasil turun dan membatasi hasilnya hingga 10 (yaitu permintaan di dalam kurung). Itu masih akan diurutkan dalam urutan menurun, dan kami tidak puas dengan itu, jadi kami meminta mysql untuk mengurutkannya sekali lagi. Sekarang kami memiliki hasil terbaru di baris terakhir.
Jika Anda membutuhkan semua kolom, dilakukan dengan cara ini:
Saya menggunakan teknik ini ketika saya secara manual menulis pertanyaan untuk memeriksa database untuk berbagai hal. Saya belum menggunakannya di lingkungan produksi, tetapi sekarang ketika saya menandainya, penyortiran tambahan tidak memengaruhi kinerja.
sumber
Jika ada indeks yang sesuai, dalam hal ini di
publish_date
lapangan, maka MySQL tidak perlu memindai seluruh indeks untuk mendapatkan 20 catatan yang diminta - 20 catatan akan ditemukan di awal indeks. Tetapi jika tidak ada indeks yang sesuai, maka scan penuh dari tabel akan diperlukan.Ada artikel Blog Kinerja MySQL dari 2009 tentang ini.
sumber
Anda bisa menambahkan [asc] atau [desc] di akhir pesanan dengan mendapatkan catatan paling awal atau terbaru
Misalnya, ini akan memberi Anda catatan terbaru terlebih dahulu
Tambahkan
LIMIT
klausa setelahnyaORDER BY
sumber
Anda dapat menggunakan kode ini di
SELECT article FROM table1 ORDER BY publish_date LIMIT 0,10
mana 0 adalah batas awal catatan & 10 jumlah catatansumber
LIMIT 10
adalah singkatanLIMIT 0,10
.LIMIT biasanya diterapkan sebagai operasi terakhir, jadi hasilnya akan disortir terlebih dahulu dan kemudian dibatasi hingga 20. Bahkan, penyortiran akan berhenti segera setelah 20 hasil penyortiran pertama ditemukan.
sumber
Juga sintaks LIMIT berbeda menurut database, misalnya:
mysql
- BATAS 1, 2postgres
- BATAS 2 OFFSET 1sumber