按订单选择Statement

时间:2011-11-11 09:55:41

标签: php mysql

我有一个包含应用程序状态的列 - (新/已批准/已拒绝/待定) 列名称是status。现在,我如何订购select语句以订购状态,以便“新”应用程序位于显示屏的顶部。

我试过这个(SELECT * FROM applications ORDER BY status where status ='New')

这不起作用,它给我错误信息。

4 个答案:

答案 0 :(得分:2)

试试这个:

SELECT * FROM applications ORDER BY status ASC;

如果你拥有的只是“新的'和“旧”,然后这将导致“新”'第一

如果您只想要新订单,那么您不需要订购:

SELECT * FROM applications WHERE `status` = 'New';

如果有各种类型的值,例如新/已批准/拒绝/待定,您只想确保'新'在顶部你可以做到这一点

   SELECT * FROM applications ORDER BY `status`, FIELD(`status`,'New');

如果你想要'新的'首先,然后批准'然后你不关心什么?

   SELECT * FROM applications ORDER BY `status`, FIELD(`status`,'New','Approved');

(ASC和DESC在FIELD之后没有效果,但status之后的DESC会将您最喜欢的值放在底部而不是顶部)

如何扭转订单但将其保持在最高位?在FIELD()函数中更改它们的顺序或参见下文。

最后,与之前的建议相反,这不起作用:

SELECT * FROM applications ORDER BY FIELD(`status`,'New','Approved'),`status`;

要解决此问题,您需要在FIELD之后使用DESC,但它会为您提供以反向排序的值(即'已批准'首先,然后'新' ,其余的):

SELECT * FROM applications ORDER BY FIELD(`status`,'New','Approved') DESC,`status`;

我想我花了太多时间在这个答案上。嗯。

答案 1 :(得分:2)

给定状态值“已存档”,“新”和“旧”(ASCDESC都不起作用)并且您想要检索所有行,首先使用“新”行,使用这样:

SELECT * FROM `applications`
ORDER BY IF(`status` = "new", 0, 1)

答案 2 :(得分:1)

丑陋但是

(SELECT * FROM applications where status ='New')
union all
(SELECT * FROM applications where status !='New')

答案 3 :(得分:0)

如果要将此用于严重的事情,请使用外键替换status列,并为status_ids的文本表示添加另一个表。 然后你可以使用

排序
SELECT * FROM applications ORDER BY status_id

尽量避免为列使用保留名称。可以使用它们(带有反引号),但如果不注意就很容易导致问题。