2009-08-07 34 views
20

Tôi muốn thực hiện lựa chọn trên bàn và sắp xếp kết quả theo từ khóa hoặc danh sách từ khóa nhất định. Ví dụ tôi có một bảng như sau:Thứ tự SQL Theo danh sách các chuỗi?

ID Code 
1 Health 
2 Freeze 
3 Phone 
4 Phone 
5 Health 
6 Hot 

nên thay vì chỉ làm một đơn giản Order By asc/desc Tôi muốn order by Health, Phone, Freeze, Hot. Điều này có thể không?

+0

Tại sao điện thoại ở đó hai lần? – pjp

Trả lời

44

Hãy thử sử dụng này:

select * from table 
order by FIELD(Code, 'Health', 'Phone', 'Freeze', 'Hot') 
+3

Đây là giải pháp thích hợp theo tài liệu (phần ý kiến). Có thể tìm thấy lời giải thích tốt [tại đây] (http://www.electrictoolbox.com/mysql-order-specific-field-values/) – kapad

+1

Hãy lưu ý rằng hàm FIELD() là đặc trưng cho MySQL và có thể không hoạt động trên Máy chủ cơ sở dữ liệu SQL. – orrd

1

Có tham gia kết quả của bạn để mã của bạn bảng và sau đó tự do code.CodeOrder

EDIT: explaing việc sử dụng các bảng mã ...

Tạo một bảng riêng biệt của Codes (CodeId, Code, CodeOrder) và tham gia vào điều này và đặt hàng bởi CodeOrder. Điều này là đẹp hơn làm lệnh theo (trường hợp ...) hack đề xuất vì bạn có thể dễ dàng thay đổi mã và các đơn đặt hàng.

+0

Tôi nghĩ rằng điểm là thứ tự mong muốn không phải là mã hoặc thứ tự ID. – cletus

+0

Tôi giả định rằng một bảng mã tồn tại cùng với mã id và id đơn đặt hàng. – pjp

12

Bạn có thể tham gia với bảng Từ khóa và bao gồm cột chuỗi và ORDER BY Keyword.Sequence.

Ví dụ bảng từ khóa của bạn trông như thế này:

ID Code  Sequence 
1 Health 1 
2 Freeze 3 
3 Phone 2 
4 Hot  4 

Sau đó, bạn có thể tham gia.

SELECT * 
FROM MyTable INNER JOIN 
      Keywords ON Keywords.ID = MyTable.KeywordID 
ORDER BY Keywords.Sequence 

Hy vọng điều này sẽ mang lại cho bạn ý tưởng.

3

tùy chọn Couple:

  1. Thêm cột OrderCode với số mong muốn để

  2. Thêm một bảng với FK ID bảng này và OrderCode

10

Dưới đây là một hack kinh khủng :

select * from table 
order by (
    case Code 
    when 'Health' then 0 
    when 'Phone' then 1 
    when 'Freeze' then 2 
    when 'Hot' then 3 
    end 
) 
+7

Tôi đồng ý với phần "hack khủng khiếp" ;-) –

+1

Tôi đồng ý quá :) và nó chỉ hoạt động với danh sách tĩnh, nếu một mã khác được thêm vào một thời điểm nào đó trong tương lai, thủ tục lưu trữ sẽ phải được cấu trúc lại tốt, để thích ứng với thay đổi này. –

+0

Vâng, nó sẽ là một ass để duy trì và không phải là ellegant như tôi muốn nhưng đây là những gì tôi sẽ phải làm. Tôi đã đề xuất một tiếp theo – Tikeb

3

Đây có phải chỉ là một tắt ORDER BY hoặc thứ gì đó mà bạn sẽ muốn thực hiện thường xuyên và có nhiều giá trị hơn được chỉ định ở đây không?

Trình tự mà bạn đã đưa ra là tùy ý, do đó một định cần phải được đưa ra để đạt được những gì bạn muốn

SELECT 
    ID, 
    Code, 
    CASE Code 
     WHEN 'Health' THEN 1 
     WHEN 'Phone' THEN 2 
     WHEN 'Freeze' THEN 3 
     WHEN 'Hot' THEN 4 
    END As OrderBy 
FROM Table 
ORDER BY 
    OrderBy 

Hoặc

SELECT 
    ID, 
    Code 
FROM Table 
ORDER BY 
    CASE Code 
     WHEN 'Health' THEN 1 
     WHEN 'Phone' THEN 2 
     WHEN 'Freeze' THEN 3 
     WHEN 'Hot' THEN 4 
    END 

(Tôi không quen thuộc với MySQL nhưng ở trên sẽ hoạt động trong SQL Server. Cú pháp cho MySQL sẽ không quá khác nhau)

Nếu bạn có khả năng muốn thực hiện việc này thường xuyên , sau đó tạo cột OrderBy trên bảng hoặc tạo bảng OrderBy có liên kết FK tới bảng này và chỉ định trường số OrderBy trong đó.

2

Hi đây là một truy vấn SQL Server nhưng tôi chắc chắn bạn có thể làm điều này trong MySQL cũng như:

SELECT ID, Code 
FROM x 
ORDER BY 
    CASE Code WHEN 'Health' THEN 1 
       WHEN 'Phone' THEN 2 
       WHEN 'Freeze' THEN 4 
       WHEN 'Hot' THEN 5 
    ELSE 6 END ASC 
    , Code ASC 
4

Ngày nay MySQL có một chức năng gọi là find_in_set()

Sử dụng công cụ như sau:

select * from table 
order by find_in_set(Code,'Health','Phone','Freeze','Hot') 
Các vấn đề liên quan