Untuk catatan
SELECT * FROM mytable WHERE id IN (1,2,3,4) ORDER BY FIELD(id,3,2,1,4);
harus bekerja juga karena Anda tidak perlu memesan daftar di WHEREklausa
Adapun cara kerjanya,
Anda dapat membuat segala macam pesanan mewah
Misalnya, menggunakan IF () function
SELECT * FROM mytable
WHERE id IN (1,2,3,4)
ORDER BY IF(FIELD(id,3,2,1,4)=0,1,0),FIELD(id,3,2,1,4);
Ini akan menyebabkan 4 id pertama muncul di bagian atas daftar, Jika tidak, ia muncul di bagian bawah. Mengapa?
Di ORDER BY, Anda mendapatkan 0 atau 1.
- Jika kolom pertama adalah 0, buat salah satu dari 4 id pertama yang muncul
- Jika kolom pertama adalah 1, buatlah itu muncul sesudahnya
Mari kita balikkan dengan DESC di kolom pertama
SELECT * FROM mytable
WHERE id IN (1,2,3,4)
ORDER BY IF(FIELD(id,3,2,1,4)=0,1,0) DESC,FIELD(id,3,2,1,4);
Di ORDER BY, Anda masih mendapatkan 0 atau 1.
- Jika kolom pertama adalah 1, buat apa saja selain 4 id pertama yang muncul.
- Jika kolom pertama adalah 0, buat 4 id pertama muncul dalam urutan asli
PERTANYAAN SEBENARNYA
Jika Anda benar-benar ingin masalah internal ini, baca halaman 189 dan 192 dari Buku

untuk menyelam yang sangat dalam.
Intinya, ada kelas C ++ yang disebut ORDER *order( ORDER BYPohon ekspresi). In JOIN::prepare, *orderdigunakan dalam fungsi yang disebut setup_order(). Kenapa di tengah JOINkelas? Setiap kueri, bahkan kueri terhadap satu tabel selalu diproses sebagai GABUNG (Lihat posting saya Apakah ada perbedaan eksekusi antara kondisi GABUNG dan kondisi DIMANA? )
Kode sumber untuk semua ini adalah sql/sql_select.cc
Jelas, ORDER BYpohon itu akan mengadakan evaluasi FIELD(id,3,2,1,4). Dengan demikian, angka 0,1,2,3,4 adalah nilai yang sedang disortir sambil membawa referensi ke baris yang terlibat.
SELECT *, FIELD(id,3,2,1,4) AS f FROM mytable WHERE id IN (3,2,1,4);Kemudian tambahkanORDER BY fatauORDER BY FIELD(id,3,2,1,4)dan coba lagi.