2010-02-01 47 views
18

Tôi có truy vấn như sau: SELECT * FROM table WHERE id IN (2,4,1,5,3);mysql tuỳ chỉnh sắp xếp

Tuy nhiên, khi tôi in ra, nó tự động được sắp xếp 1,2,3,4,5. Làm thế nào chúng ta có thể duy trì thứ tự (2,4,1,5,3) mà không thay đổi cấu trúc cơ sở dữ liệu?

Cảm ơn!

Trả lời

20

tôi hỏi này:

mysql order by issue

câu trả lời mà tôi nhận được và tất cả các tín dụng thuộc đối với họ là:

Bạn có thể sử dụng một nhà điều hành TRƯỜNG HỢP để xác định thứ tự:

SELECT * FROM table 
WHERE id IN (3,6,1,8,9) 
ORDER BY CASE id WHEN 3 THEN 1 
       WHEN 6 THEN 2 
       WHEN 1 THEN 3 
       WHEN 8 THEN 4 
       WHEN 9 THEN 5 
     END 

trong php u có thể làm như sau:

<?php 

$my_array = array (3,6,1,8,9) ; 

$sql = 'SELECT * FROM table WHERE id IN (3,6,1,8,9)'; 

$sql .= "\nORDER BY CASE id\n"; 
foreach($my_array as $k => $v){ 
    $sql .= 'WHEN ' . $v . ' THEN ' . $k . "\n"; 
} 
$sql .= 'END '; 

echo $sql; 

?> 
+6

Giải pháp của Lucas Rossini Ferreira đơn giản hơn nhiều so với điều này. – mkataja

+0

có bạn là đúng –

2

Các Sắp Xếp Theo lĩnh vực không bao giờ làm việc cho tôi. Tôi đã có một danh sách các nước và tôi cần Hoa Kỳ và Canada để xuất hiện trên đầu danh sách, vì vậy truy vấn của tôi là như thế này:

SELECT * FROM countries ORDER BY code='USA', code='CAN', name ASC 

này không bao giờ làm việc, nhưng tôi nhận ra rằng thứ tự là khác nhau, đó là hiển thị Canada và các Tiểu bang ở cuối danh sách, vì vậy tôi đã làm điều này:

SELECT * FROM countries ORDER BY code!='USA', code!='CAN', name ASC 

Và nó hoạt động ... tại sao? Đánh tôi, nhưng nó đã làm; hãy thử nó.

5

(Tôi sẽ viết bài này như một lời nhận xét về câu trả lời Michel Tobon, nhưng không có danh tiếng, xin lỗi :-)

"Và nó làm việc ... tại sao? Beats tôi, nhưng nó chỉ làm ; hãy thử nó. "

Lý do hoạt động là do cụm từ "mã! = 'USA'" của bạn tạo ra kết quả boolean, trong SQL được biểu diễn dưới dạng 1 hoặc 0. Vì vậy, biểu thức "code = 'USA' tạo 1 đối với mỗi bản ghi phù hợp với tiêu chí đó, và 0 cho mỗi bản ghi không đúng, vì 1 là sau 0 trong một sắp xếp tăng dần (mặc định), các bản ghi trùng khớp sẽ sắp xếp muộn hơn các bản ghi chưa được so khớp. .

một (có thể rõ ràng hơn) cách sản xuất cùng một kết quả sẽ như sau:

SELECT * FROM countries ORDER BY code='USA' DESC, code='CAN' DESC, name ASC 

Tất nhiên trong một vung câu hỏi của OP, tôi thích tùy chọn FIELD() tốt nhất - khá sạch sẽ :-)

+0

Giải thích rất rõ. – ChristianLinnell

+0

Cảm ơn :-) (Tôi có đủ tiếng để bình luận ngay bây giờ! :-D) – opensourcejunkie

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