Saat ini saya sedang melakukan OrderBy yang sangat mendasar dalam pernyataan saya.
SELECT * FROM tablename WHERE visible=1 ORDER BY position ASC, id DESC
Masalah dengan ini adalah bahwa entri NULL untuk 'posisi' diperlakukan sebagai 0. Oleh karena itu semua entri dengan posisi sebagai NULL muncul sebelum orang-orang dengan 1,2,3,4. misalnya:
NULL, NULL, NULL, 1, 2, 3, 4
Apakah ada cara untuk mencapai pemesanan berikut:
1, 2, 3, 4, NULL, NULL, NULL.
mysql
sql-order-by
JonB
sumber
sumber
Jawaban:
MySQL memiliki sintaksis tanpa dokumen untuk mengurutkan null yang terakhir. Tempatkan tanda minus (-) di depan nama kolom dan alihkan ASC ke DESC:
Ini pada dasarnya kebalikan dari
position DESC
menempatkan nilai NULL yang terakhir tetapi sebaliknya sama denganposition ASC
.Referensi yang baik ada di sini http://troels.arvin.dk/db/rdbms#select-order_by
sumber
- col_name
adalah ekspresi (0 - col_name
), yang diterima oleh klausa ORDER BY. Tentu saja ini hanya berfungsi untuk kolom angka.date
dantime
kolom juga! (MySQL 5.5). Saya kira (saya malas memeriksa) berfungsi untuk semua kolom angka-suka (timestamp, float ...).Saya menemukan ini menjadi solusi yang baik untuk sebagian besar:
sumber
SELECT * FROM table ORDER BY ISNULL(field) ASC;
(MySQL 5.5)NULLS LAST
|NULLS FIRST
untuk membaliknya alih-alih solusi di sini.Sesuatu seperti
Ganti 999999999 dengan apa nilai maksimal bidang tersebut
sumber
NULL TERAKHIR
sumber
Anda dapat menukar contoh NULL dengan nilai yang berbeda untuk mengurutkannya terlebih dahulu (seperti 0 atau -1) atau terakhir (sejumlah besar atau huruf) ...
sumber
Coba gunakan permintaan ini:
sumber
Anda dapat menyatukan NULL Anda dalam
ORDER BY
pernyataan:Jika Anda ingin NULL mengurutkan di bagian bawah, coba
coalesce(position, 100000)
. (Buat angka kedua lebih besar dari yang lainnyaposition
di db.)sumber
sumber
Untuk
DATE
kolom, Anda dapat menggunakan:NULLS terakhir:
Kosong lalu:
sumber
Untuk mencapai hasil berikut:
1, 2, 3, 4, NULL, NULL, NULL.
GUNAKAN sintaks, tempatkan
-(minus sign)
sebelum nama bidang dan gunakan inverse order_type (Seperti: Jika Anda ingin memesan dengan pesanan ASC kemudian gunakan DESC atau jika Anda ingin pesanan DESC maka gunakan ASC)SELECT * FROM tablename WHERE visible=1 ORDER BY -position DESC
sumber
Ini berfungsi dengan baik:
sumber
Mengapa Anda tidak memesan dengan NULLS LAST?
sumber
NULLS LAST
- versi MySQL apa yang diperkenalkan?