สำหรับบันทึก
SELECT * FROM mytable WHERE id IN (1,2,3,4) ORDER BY FIELD(id,3,2,1,4);
ควรทำงานเช่นกันเพราะคุณไม่จำเป็นต้องเรียงลำดับรายการในWHERE
ข้อ
สำหรับวิธีการทำงาน
คุณสามารถสร้างคำสั่งแฟนซีทุกประเภท
ตัวอย่างเช่นการใช้ฟังก์ชันIF ()
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);
นี่จะทำให้รหัส 4 รหัสแรกปรากฏที่ด้านบนของรายการมิฉะนั้นจะปรากฏที่ด้านล่าง ทำไม?
ในการที่ORDER BY
คุณจะได้รับ 0 หรือ 1
- ถ้าคอลัมน์แรกคือ 0 ให้ทำ 4 รหัสแรกปรากฏขึ้น
- หากคอลัมน์แรกคือ 1 ให้ทำให้ปรากฏหลังจากนั้น
ลองพลิกด้วย DESC ในคอลัมน์แรก
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);
ในตัวORDER BY
คุณยังคงได้รับ 0 หรือ 1
- หากคอลัมน์แรกคือ 1 ให้สร้างอะไรก็ได้ยกเว้น 4 รหัสแรกจะปรากฏขึ้น
- ถ้าคอลัมน์แรกเป็น 0 ให้ 4 รหัสแรกปรากฏในลำดับเดิม
คำถามจริงของคุณ
หากคุณต้องการ internals เกี่ยวกับเรื่องนี้อย่างจริงจังไปที่หน้า 189 และ 192 ของหนังสือ
สำหรับการดำน้ำลึกที่แท้จริง
ในสาระสำคัญมีคลาส C ++ ที่เรียกว่าORDER *order
( ORDER BY
ต้นไม้นิพจน์) ในJOIN::prepare
, ถูกนำมาใช้ในการทำงานที่เรียกว่า*order
ทำไมในช่วงกลางของการเรียน? ทุกการสืบค้นแม้แต่การสืบค้นกับตารางเดียวจะถูกประมวลผลเป็น JOIN เสมอ (ดูโพสต์ของฉันมีความแตกต่างในการดำเนินการระหว่างเงื่อนไข JOIN และเงื่อนไข WHERE หรือไม่ )setup_order()
JOIN
ซอร์สโค้ดทั้งหมดนี้คือ sql/sql_select.cc
เห็นได้ชัดว่าที่ต้นไม้จะจัดให้มีการประเมินผลของORDER BY
FIELD(id,3,2,1,4)
ดังนั้นตัวเลข 0,1,2,3,4 จึงเป็นค่าที่เรียงลำดับขณะทำการอ้างอิงกับแถวที่เกี่ยวข้อง
SELECT *, FIELD(id,3,2,1,4) AS f FROM mytable WHERE id IN (3,2,1,4);
จากนั้นเพิ่มORDER BY f
หรือORDER BY FIELD(id,3,2,1,4)
ลองอีกครั้ง