我有一个包含应用程序状态的列 - (新/已批准/已拒绝/待定) 列名称是status。现在,我如何订购select语句以订购状态,以便“新”应用程序位于显示屏的顶部。
我试过这个(SELECT * FROM applications ORDER BY status where status ='New')
这不起作用,它给我错误信息。
答案 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)
给定状态值“已存档”,“新”和“旧”(ASC
或DESC
都不起作用)并且您想要检索所有行,首先使用“新”行,使用这样:
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
尽量避免为列使用保留名称。可以使用它们(带有反引号),但如果不注意就很容易导致问题。