2012-06-07 32 views
25

Tôi sẽ có danh sách các mục cố định để sắp xếp theo thứ tự mà tôi sẽ không biết cho đến khi tôi chạy truy vấn vì có một bước ngẫu nhiên.thứ tự mysql theo danh sách cố định

Tôi muốn có một cái gì đó như sau:

rằng is_launch_set sẽ trở lại 1,3,7,11 nhưng đã được chọn ngẫu nhiên xuống dưới:

select * from items where is_launch_set=1 order by id values (3,11,7,1); 

bất kỳ ý tưởng về làm thế nào để đạt được điều này? Tôi đã suy nghĩ có thể là một find_in_set nhưng không thực sự chắc chắn.

+0

thể trùng lặp: [MySQL Sắp xếp theo một số danh sách] (http: // stackoverflow .com/questions/6810793 /), mặc dù điều này thu hút một câu trả lời kỹ lưỡng hơn. –

Trả lời

55

Bạn có thể làm điều đó bằng cách sử dụng một trong hai:

ORDER BY FIND_IN_SET(id, '3,11,7,1') 

hoặc

ORDER BY FIELD(id, 3, 11, 7, 1) 

hoặc

ORDER BY CASE id WHEN 3 THEN 0 
       WHEN 11 THEN 1 
       WHEN 7 THEN 2 
       WHEN 1 THEN 3 
         ELSE 4 
     END 
+1

là bạn chắc chắn tìm thấy trong bộ sẽ làm việc - trước khi tôi hỏi quesiton, đó là những gì tôi nghĩ rằng câu trả lời sẽ được nhưng thứ tự dường như khác nhau mỗi lần. Có bất kỳ cài đặt cấu hình nào hay bất kỳ thứ gì khác. Câu trả lời của trường có vẻ tốt. – timpone

+0

@timpone: Tôi chắc chắn nó hoạt động. Bạn có thể đặt 'FIND_IN_SET (id, '3,11,7,1')' vào 'SELECT' để đảm bảo nó trả về những gì được mong đợi – zerkms

+1

Bạn có bất kỳ thông tin nào về cách tiếp cận nào trong số này là hoạt động nhanh nhất không? Có bất cứ điều gì có thể làm để tăng tốc nó lên bên cạnh việc đặt một chỉ mục trên trường 'id'? –

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