Urutan MySQL berdasarkan nilai ID tertentu

96

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?

Jerry2
sumber
Apakah Anda bertanya apakah ada cara mysql dapat memesan tanpa urutan tertentu?
stefgosselin
1
Sepertinya model data Anda rusak / tidak lengkap (dari mana asal pesanan ini?) Atau sebagai alternatif, Anda menyalahgunakan MySQL.
derobert

Jawaban:

204

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.

Manjula
sumber
Sepertinya saya tidak bisa membuat ini berfungsi tanpa juga menggunakan: WHERE ID IN (1,5,4,3)
TV-C-15
1
bagaimana Anda akan menggunakan ini dengan nilai Tidak Ada?
Nono London
30

Anda harus dapat menggunakan CASEuntuk ini:

ORDER BY CASE id
  WHEN 1 THEN 1
  WHEN 5 THEN 2
  WHEN 4 THEN 3
  WHEN 3 THEN 4
  ELSE 5
END
NPE
sumber
18

Di dokumentasi resmi untuk mysql tentang ORDER BY , seseorang telah memposting yang dapat Anda gunakan FIELDuntuk 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.

Jan Dragsbaek
sumber
7
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

Bruno Mangini Alves
sumber
Ok Terima kasih atas sarannya
Bruno Mangini Alves
6

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.

Bjoern
sumber
1

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 INpernyataan.

select id,name 
from products
order by case when id in (30,20,10) then -1 else id end,id
Rajesh Kharatmol
sumber
Tambahkan beberapa deskripsi lagi
Mathews Sunny
jika Anda ingin menggunakan pesanan dengan hanya satu id maka gunakan kueri pertama dan jika Anda ingin beberapa id maka gunakan kueri kedua
Rajesh Kharatmol
0

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:

Bangalore - id:1
Other     - id:2
Mumbai    - id:3
Pune      - id:4
Ambala    - id:5

keluaran saya:

Ambala  
Bangalore  
Mumbai  
Pune
Other
Preeti
sumber
2
Coba tambahkan penjelasan ke kode Anda, ini akan membuat jawaban Anda lebih jelas dan mudah dimengerti. Harap baca stackoverflow.com/help/how-to-answer
32cupo
jika Anda ingin menggunakan urutan dengan hanya satu id (Misalnya: Anda ingin opsi "lainnya" di daftar terakhir dan semua kota ditampilkan dalam urutan abjad.) sehingga Anda dapat menggunakan kueri ini. itu bekerja untuk saya.
Preeti
-1
SELECT * FROM TABLE ORDER BY (columnname,1,2) ASC OR DESC
Hisham shahid
sumber
2
Bisakah Anda menjelaskannya lebih lanjut? Ini terlihat mirip dengan jawaban yang diterima, tetapi menurut saya itu bukan ASC OR DESCsintaks yang tepat
Nico Haase
@NicoHaase perbedaan antara ASC dan DESC adalah jika Anda menggunakan asc maka id yang Anda gunakan di fungsi lapangan akan datang pada akhirnya dan jika Anda menggunakan DESC maka id di fungsi lapangan akan didahulukan
Hisham shahid
@NicoHaase Anda dapat menggunakan ASC atau DESC dengan kueri yang sesuai dengan persyaratan
Hisham shahid
Jadi, Anda tidak dapat menggunakan keduanya dalam satu kueri. Nico, menurut saya, menyarankan Anda membuat jawaban Anda benar secara sintaksis. Saya cukup yakin dia tahu apa sebenarnya arti ASD dan DESC :)
RiggsFolly
Ini tidak masuk akal dan pasti tidak akan berhasil. Anda perlu menggunakan FIELDfungsi yang identik dengan jawaban yang diterima dari 8 tahun sebelumnya.
hackel