2014-05-07 88 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