Apakah mungkin untuk mengurutkan dalam mysql dengan "order by" menggunakan kumpulan nilai kolom (ID) yang telah ditentukan seperti: order by (ID = 1,5,4,3) jadi saya akan mendapatkan record 1, 5, 4, 3 di dalamnya memesan?
UPDATE: Tentang menyalahgunakan mysql ;-) Saya harus menjelaskan mengapa saya membutuhkan ini ...
Saya ingin catatan saya berubah secara acak setiap 5 menit. Saya memiliki tugas cron untuk melakukan tabel pembaruan untuk meletakkan urutan acak yang berbeda di dalamnya. Hanya ada satu masalah! PAGINASI. Saya akan memiliki pengunjung yang datang ke halaman saya dan saya memberinya 20 hasil pertama. Dia akan menunggu 6 menit dan pergi ke halaman 2 dan dia akan mendapatkan hasil yang salah karena urutan sortir telah berubah.
Jadi saya berpikir bahwa jika dia datang ke situs saya, saya memasukkan semua ID ke sesi dan ketika dia berada di halaman 2 dia mendapatkan catatan yang benar bahkan jika penyortiran sudah berubah.
Apakah ada cara lain yang lebih baik untuk melakukan ini?
Jawaban:
Anda dapat menggunakan fungsi ORDER BY dan FIELD. Lihat http://lists.mysql.com/mysql/209784
SELECT * FROM table ORDER BY FIELD(ID,1,5,4,3)
Ia menggunakan fungsi Field () , Yang "Mengembalikan indeks (posisi) dari str dalam daftar str1, str2, str3, .... Mengembalikan 0 jika str tidak ditemukan" menurut dokumentasi. Jadi sebenarnya Anda mengurutkan hasil yang ditetapkan oleh nilai yang dikembalikan dari fungsi ini yang merupakan indeks dari nilai bidang di set yang diberikan.
sumber
Anda harus dapat menggunakan
CASE
untuk ini:ORDER BY CASE id WHEN 1 THEN 1 WHEN 5 THEN 2 WHEN 4 THEN 3 WHEN 3 THEN 4 ELSE 5 END
sumber
Di dokumentasi resmi untuk mysql tentang ORDER BY , seseorang telah memposting yang dapat Anda gunakan
FIELD
untuk masalah ini, seperti ini:SELECT * FROM table ORDER BY FIELD(id,1,5,4,3)
Ini adalah kode yang belum teruji yang secara teori harus berfungsi.
sumber
SELECT * FROM table ORDER BY id='8' DESC, id='5' DESC, id='4' DESC, id='3' DESC
Jika saya memiliki 10 register misalnya, dengan cara ini ID 1, 5, 4 dan 3 akan muncul lebih dulu, selanjutnya register yang lain akan muncul.
Pertunjukan normal 1 2 3 4 5 6 7 8 9 10
Dengan cara ini
8 5 4 3 1 2 6 7 9 10
sumber
Ada cara lain untuk mengatasi ini. Tambahkan tabel terpisah, seperti ini:
CREATE TABLE `new_order` ( `my_order` BIGINT(20) UNSIGNED NOT NULL, `my_number` BIGINT(20) NOT NULL, PRIMARY KEY (`my_order`), UNIQUE KEY `my_number` (`my_number`) ) ENGINE=INNODB;
Tabel ini sekarang akan digunakan untuk menentukan mekanisme pesanan Anda.
Tambahkan nilai Anda di sana:
my_order | my_number ---------+---------- 1 | 1 2 | 5 3 | 4 4 | 3
... dan kemudian ubah pernyataan SQL Anda saat bergabung dengan tabel baru ini.
SELECT * FROM your_table AS T1 INNER JOIN new_order AS T2 on T1.id = T2.my_number WHERE ....whatever... ORDER BY T2.my_order;
Solusi ini sedikit lebih kompleks daripada solusi lain, tetapi dengan menggunakan ini Anda tidak perlu mengubah
SELECT
-statement Anda setiap kali kriteria pesanan Anda berubah - cukup ubah data di tabel pesanan.sumber
Jika Anda perlu memesan satu id terlebih dahulu dalam hasil, gunakan id.
select id,name from products order by case when id=5 then -1 else id end
Jika Anda perlu memulai dengan urutan beberapa id, tentukan koleksi, mirip dengan apa yang akan Anda gunakan dengan
IN
pernyataan.select id,name from products order by case when id in (30,20,10) then -1 else id end,id
sumber
Jika Anda ingin memesan satu id terakhir dalam hasil, gunakan urutan berdasarkan kasus. (Misalnya: Anda ingin opsi "lainnya" di daftar kota terakhir dan semua kota ditampilkan dalam urutan abjad.)
select id,city from city order by case when id = 2 then city else -1 end, city ASC
Jika saya memiliki 5 kota misalnya, saya ingin menampilkan kota dalam urutan abjad dengan tampilan opsi "lainnya" terakhir di dropdown, maka kita dapat menggunakan kueri ini. lihat contoh lain yang ditampilkan di tabel saya di id kedua (id: 2) jadi saya menggunakan "ketika id = 2" di kueri di atas.
catatan dalam tabel DB:
keluaran saya:
sumber
SELECT * FROM TABLE ORDER BY (columnname,1,2) ASC OR DESC
sumber
ASC OR DESC
sintaks yang tepatFIELD
fungsi yang identik dengan jawaban yang diterima dari 8 tahun sebelumnya.