2012-12-31 37 views
48

Tôi có một bảng với 3 cột:Thứ tự theo giá trị lĩnh vực cụ thể đầu tiên

id | name | priority 
-------------------- 
1 | core | 10 
2 | core | 9 
3 | other | 8 
4 | board | 7 
5 | board | 6 
6 | core | 4 

Tôi muốn đặt hàng tập kết quả sử dụng priority nhưng trước tiên những hàng có name=core thậm chí nếu có ưu tiên thấp hơn. Kết quả sẽ trông giống như

id | name | priority 
-------------------- 
6 | core | 4 
2 | core | 9 
1 | core | 10 
5 | board | 6 
4 | board | 7 
3 | other | 8 

Trả lời

57

Ngoài ra còn có MySQL FIELD function.

Nếu bạn muốn sắp xếp hoàn chỉnh cho tất cả các giá trị có thể:

SELECT id, name, priority 
FROM mytable 
ORDER BY FIELD(priority, "core", "board", "other") 

Nếu bạn chỉ quan tâm rằng "cốt lõi" là đầu tiên và các giá trị khác không quan trọng:

SELECT id, name, priority 
FROM mytable 
ORDER BY FIELD(priority, "core") DESC 

Nếu bạn muốn để sắp xếp theo "lõi" trước tiên và các trường khác theo thứ tự sắp xếp thông thường:

Có một số cảnh báo ở đây, mặc dù:

Trước tiên, tôi chắc chắn đây là chức năng chỉ có mysql - câu hỏi được gắn thẻ mysql, nhưng bạn không bao giờ biết.

Thứ hai, chú ý đến cách FIELD() công trình: nó sẽ trả về chỉ số một dựa trên giá trị - trong trường hợp FIELD(priority, "core"), nó sẽ trở về 1 nếu "cốt lõi" là giá trị. Nếu giá trị của trường không có trong danh sách, nó trả về số không. Đây là lý do tại sao DESC là cần thiết trừ khi bạn chỉ định tất cả các giá trị có thể.

+3

Sau khoảng 5 năm tôi đã thay đổi câu trả lời chấp nhận cho câu trả lời này bởi vì nó sạch hơn và nhanh hơn. – Omid

+0

db2 tương đương? – Cybermonk

3

Một cách này là thế này:

select id, name, priority from table a 
order by case when name='core' then -1 else priority end asc, priority asc 
+1

Sẽ không mất thứ tự của các hàng 'lõi' này? – mellamokb

+1

@ mellamokb no, with my edit;) – Icarus

6

Một cách để dành ưu tiên cho hàng cụ thể là thêm một số lượng lớn để ưu tiên của họ. Bạn có thể làm điều này với một tuyên bố CASE:

select id, name, priority 
    from mytable 
order by priority + CASE WHEN name='core' THEN 1000 ELSE 0 END desc 

Demo: http://www.sqlfiddle.com/#!2/753ee/1

79

Nói chung bạn có thể làm

select * from your_table 
order by case when name = 'core' then 1 else 2 end, 
     priority 

Đặc biệt trong MySQL bạn cũng có thể làm

select * from your_table 
order by name <> 'core', 
     priority 

Kể từ khi kết quả của một so sánh trong MySQL là 0 hoặc 1 và bạn có thể sắp xếp theo kết quả đó.

+5

+1 Giải pháp sạch hơn nhiều so với tôi :) – mellamokb

+1

'1' và' 2' có nghĩa là gì? –

+1

Tôi đã có khoảng 3000 hàng để sắp xếp. Trong trường hợp của tôi, giải pháp của @ Ayman-Hourieh trên http://stackoverflow.com/questions/958627/mysql-order-by-values-within-in mất một nửa thời gian so với giải pháp này. – nightlyop

1

này làm việc cho tôi sử dụng Postgres 9 +:

SELECT * 
FROM your_table 
ORDER BY name = 'core' DESC, priority DESC 
+0

Chăm sóc để giải thích -1? Lỗi + phiên bản Postgres? –

0

làm điều này:

SELECT * FROM table ORDER BY column `name`+0 ASC 

Phụ thêm các +0 sẽ có nghĩa là:

0, 10, 11, 2, 3, 4 

trở thành:

0, 2, 3, 4, 10, 11 
2
SELECT * FROM cars_new WHERE status = '1' and car_hide !='1' and cname IN ('Executive Car','Saloon','MPV+','MPV5') ORDER BY FIELD(cname, 'Executive Car', 'Saloon','MPV+','mpv5') 
+3

Mặc dù mã của bạn có thể là câu trả lời cho câu hỏi, tốt hơn là nên cung cấp một số giải thích về nó. – Mehraban

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