2010-07-21 34 views
32

Tôi có một bảng với các hạng mục:SQLite và tùy chỉnh trật tự bởi

ID Category 
"1","Baking" 
"3","Family" 
"4","Entertaining" 
"5","Children" 
"6","Desserts" 

Bây giờ tôi muốn đặt kết quả của câu lệnh select để

ID Category 
"4","Entertaining" 
"3","Family" 
"1","Baking" 
"5","Children" 
"6","Desserts" 

ví dụ. Trong MySQL, bạn sẽ làm như sau:

SELECT * FROM CATEGORIES ORDER BY FIELD (ID, 4,3,1,5,6); 

Bạn sẽ làm như thế nào trong SQLite? Tôi không có trường "đặt hàng".

Trả lời

59
ORDER BY 
    CASE ID 
    WHEN 4 THEN 0 
    WHEN 3 THEN 1 
    WHEN 1 THEN 2 
    WHEN 5 THEN 3 
    WHEN 6 THEN 4 
    END 
+3

+1 ya tôi quá, tôi đã chỉ cần gõ nó ra. Tất nhiên, tùy chọn khác là tạo một thuộc tính hoạt động như một ưu tiên, sau đó bạn chỉ có thể đặt hàng theo mức độ ưu tiên. Đây không phải là cách lý tưởng, nhưng là một giải pháp mà tôi đã phải sử dụng trong quá khứ. – northpole

+0

Đối với tốc độ với các tập dữ liệu lớn, tôi có thể tạo một bảng trợ giúp được lập chỉ mục có chứa các ID và thứ tự mong muốn của chúng, sau đó nối với nó và sắp xếp theo cột được lập chỉ mục của nó. Không chắc chắn làm thế nào SQLite sẽ xử lý này, nhưng "lớn hơn" động cơ DB có lẽ sẽ có lợi, như là biểu hiện CASE không phải là tối ưu cho đặt hàng. – Tomalak

1

Tôi không có một "tự do" lĩnh vực

Tại sao không?

Nếu đó là do thứ tự sắp xếp là ứng dụng riêng biệt thì hãy sắp xếp trong ứng dụng chứ không phải trong cơ sở dữ liệu.

Nếu đó là do thứ tự sắp xếp cụ thể cho chỉ một truy vấn này thì hãy mã hóa nó trong truy vấn BAO GIỜ tôi đề nghị bạn làm cho điều này minh bạch cho ứng dụng gọi điện, ví dụ: (Tiêu chuẩn SQL cú pháp):

SELECT T2.ID, T2.Category, 
     T2.query_name_here_sort_order 
    FROM (
     SELECT T1.ID, T1.Category, 
       CASE ID 
        WHEN 4 THEN 1 
        WHEN 3 THEN 2 
        WHEN 1 THEN 3 
        WHEN 5 THEN 4 
        WHEN 6 THEN 5 
       END AS query_name_here_sort_order 
      FROM CATEGORIES AS T1 
     ) AS T2 (
       ID, Category, 
       query_name_here_sort_order 
       ) 
ORDER 
    BY query_name_here_sort_order; 

Nếu thứ tự sắp xếp được sử dụng bởi nhiều truy vấn và/hoặc các ứng dụng sau đó thêm nó vào một cột trong một bảng trong cơ sở dữ liệu sau đó sử dụng cột trong truy vấn của bạn.

0

Một cách thứ hai để làm việc đó (một trong những đầu tiên là với CASE WHEN ... THEN END như đã được nêu trong câu trả lời khác) là:

ORDER BY ID=4 DESC, 
     ID=3 DESC, 
     ID=1 DESC, 
     ID=5 DESC, 
     ID=6 DESC 
Các vấn đề liên quan