2010-09-26 27 views
41

Tôi có một cái gì đó giống nhưMySQL Chọn ĐÂU TRÊN thứ tự nhất định

SELECT * FROM table WHERE id IN (118,17,113,23,72); 

Nếu tôi chỉ làm điều này nó sẽ trả về các hàng theo thứ tự ID tự tăng dần. Có cách nào để lấy lại các hàng theo thứ tự được đưa ra trong câu lệnh IN không?

Trả lời

77

Bạn nên sử dụng "ORDER BY FIELD". Vì vậy, ví dụ:

SELECT * FROM table WHERE id IN (118,17,113,23,72) 
ORDER BY FIELD(id,118,17,113,23,72) 
+0

Cảm ơn bạn! Những công việc này! – kentor

+0

@kentor: không sao cả, vui mừng đã giúp – nico

+1

Hiệu suất hoạt động như thế nào? Có chậm không khi chỉ định lại cùng một danh sách id? – Emerald214

11

Hãy thử sử dụng FIND_IN_SET:

SELECT * FROM table WHERE id IN (118,17,113,23,72) 
    ORDER BY FIND_IN_SET(id, '118,17,113,23,72'); 
+0

+1: Đó sẽ là đề xuất của tôi –

+3

Làm cách nào để 'find_in_set' so sánh với' trường'? – ShiningRay

+2

@ShiningRay Từ hướng dẫn sử dụng có vẻ như 'FIELD' là một phương thức đơn giản và' FIND_IN_SET' mạnh hơn và phức tạp hơn bao gồm việc phân tích chuỗi và tạo 'SET'. – Igor

0

Một lựa chọn là sử dụng UNION:

SELECT * FROM table WHERE id = 118 
UNION 
SELECT * FROM table WHERE id = 17 
UNION 
SELECT * FROM table WHERE id = 113 
... 
+0

Hoặc 'UNION ALL' nếu bạn đang nhận lại các hàng có thể trùng lặp nhau. Trong mã của tôi có vẻ như điều này có thể khá chậm mặc dù. –

0

Bạn có thể tạo ra một số để sắp xếp trên dựa trên các giá trị id:

select * 
from table 
where id in (118,17,113,23,72) 
order by 
    case id 
    when 118 then 1 
    when 17 then 2 
    when 133 then 3 
    when 23 then 4 
    when 72 then 5 
    end 
0

đây là điều đầu tiên xuất hiện trong đầu bạn. lưu ý sql là chưa được kiểm tra, bạn có thể cần phải kiểm tra đúng cú pháp

của nó một chút rườm rà, nhưng có thể làm các trick

select * from table where id = 118 
union 
select * from table where id = 17 
union 
.... and so on 
0

Tôi nghĩ rằng nếu bạn đã làm một truy vấn UNION với mỗi lựa chọn, nó có thể gửi trả lại theo thứ tự.

SELECT * FROM table WHERE id=118 
UNION 
SELECT * FROM table WHERE id=17 
... 

Xấu xí, nhưng tôi nghĩ nó sẽ hoạt động.

2

Bạn có thể tạo một bảng tạm thời với hai cột (ID, order_num):

ID order_num 
118 1 
17 2 
113 3 
23 4 
72 5 

Sau đó tham gia:

SELECT * from table 
INNER JOIN #temp_table 
ON table.id = #temp_table.id 

Chú ý rằng bạn có thể thả mệnh đề IN.

Thỉnh thoảng tôi thực sự tạo bảng vĩnh viễn, vì khi đó khách hàng chắc chắn thay đổi ý định của họ về việc đặt hàng, tôi không phải chạm vào mã, chỉ cần bàn.

Sửa

Câu trả lời sử dụng ORDER BY FIELD() (mà tôi không biết về) có lẽ là những gì bạn muốn.

+1

+1 Đối với nhận xét "không thể tránh khỏi" (và hoàn toàn đúng). – Julian

Các vấn đề liên quan