Đối với hồ sơ
SELECT * FROM mytable WHERE id IN (1,2,3,4) ORDER BY FIELD(id,3,2,1,4);
cũng nên hoạt động vì bạn không phải sắp xếp danh sách trong WHERE
mệnh đề
Về cách thức hoạt động,
Bạn có thể tạo tất cả các loại đơn đặt hàng ưa thích
Ví dụ, bằng cách sử dụng ) (NẾU chức năng
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);
Điều này sẽ khiến 4 id đầu tiên xuất hiện ở đầu danh sách, nếu không, nó sẽ xuất hiện ở cuối. Tại sao?
Trong ORDER BY
, bạn có được 0 hoặc 1.
- Nếu cột đầu tiên là 0, làm cho bất kỳ 4 id đầu tiên xuất hiện
- Nếu cột đầu tiên là 1, làm cho nó xuất hiện sau đó
Hãy lật nó với DESC trong cột đầu tiên
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);
Trong ORDER BY
, bạn vẫn nhận được 0 hoặc 1.
- Nếu cột đầu tiên là 1, hãy tạo mọi thứ trừ 4 id đầu tiên xuất hiện.
- Nếu cột đầu tiên là 0, hãy tạo 4 id đầu tiên xuất hiện theo thứ tự ban đầu
CÂU HỎI THỰC TẾ CỦA BẠN
Nếu bạn thực sự muốn có nội bộ về điều này, hãy xem trang 189 và 192 của Sách
cho một lần lặn sâu thực sự.
Về bản chất, có một lớp C ++ được gọi là ORDER *order
(Cây ORDER BY
biểu thức). Trong JOIN::prepare
, *order
được sử dụng trong một chức năng gọi là setup_order()
. Tại sao ở giữa JOIN
lớp? Mọi truy vấn, thậm chí một truy vấn đối với một bảng duy nhất luôn được xử lý dưới dạng THAM GIA (Xem bài đăng của tôi Có sự khác biệt thực thi giữa điều kiện THAM GIA và điều kiện WHERE không? )
Mã nguồn cho tất cả điều này là sql/sql_select.cc
Rõ ràng, ORDER BY
cây sẽ tổ chức đánh giá FIELD(id,3,2,1,4)
. Do đó, các số 0,1,2,3,4 là các giá trị được sắp xếp trong khi mang tham chiếu đến hàng liên quan.
SELECT *, FIELD(id,3,2,1,4) AS f FROM mytable WHERE id IN (3,2,1,4);
Sau đó thêmORDER BY f
hoặcORDER BY FIELD(id,3,2,1,4)
thử lại.