2014-05-07 92 views
1

的MySQL我有一個表「book_history」有場「狀態」訂單在沒有ASC和DESC

So there are three values for the field 'status' => 0,1,2 

現在我想查詢它的排序依據 - 我的ASC和ORDER BY遞減知道訂單那裏。 但我真正想要的是

select * from book_history order by status 1,0,2 

我檢查的順序,然後也。但我無法提出我的問題。

所以最終的輸出將是 - 首先它應該列出狀態= 1,那麼狀態= 0,然後狀態=「2」

任何幫助。

感謝,

Kimz

回答

3

可以使用FIELD()功能

SELECT 
    * 
FROM 
    book_history 
ORDER BY FIELD(`status`, 1, 0, 2) 
+1

對不起哈立德,我的印象是錯誤的。 –

+1

khalid - 謝謝..剛纔標記爲您的答案再次被接受...再次感謝您的幫助 – user3350885

0

另一種選擇與UNION

select * from book_history where status = 1 
UNION 
select * from book_history where status = 0 
UNION 
select * from book_history where status = 2 
+0

你應該使用** UNION ALL **,當顯然沒有重複刪除。但是,UNION甚至UNION ALL都不保證維持訂單。你仍然需要一個ORDER BY子句來保證獲得結果的順序。 –

1

使用CASE表達式來獲得訂單的關鍵:

select * 
from book_history 
order by 
    case status 
    when 1 then 100 -- any small value would do here 
    when 0 then 200 -- any medium value would do here 
    when 2 then 300 -- any big value would do here 
    end; 
+1

這是標準SQL,應該可以在幾乎所有的dbms中工作。 M Khalid Junaid使用FIELD()的答案是MySQL特有的。我會用他的解決方案而不是我的可讀性。 (如果你不是因爲某些原因被迫使用標準的SQL,這是)。 –

3

使用下面的查詢強制順序查詢:

select * from book_history 
ORDER BY FIELD (status,1,0,2); 

欲瞭解更多信息,如果有更多的價值和你繼續頂你的價值觀,之後休息值,則可以使用下面的查詢:

select * from book_history 
ORDER BY FIELD (status,2,0,1) desc; 
+1

請使用upvote,而不是發佈另一個答案 –

+0

@RakeshSharma首先,當我更新我的答案時,沒有回答這個查詢...無論如何,你是否看到任何其他答案與我一樣.. –

+0

@RakeshSharma:我猜這個答案與M Khalid Junaid的回答不同。 –

2

您可以使用ORDER BY FIELD:

SELECT * FROM book_history ORDER BY FIELD(status, 1,0,2) 
+0

確切的代碼,我想要的。多謝兄弟。我的救命 – user3350885