我在MySQL中有一个表,它有两个非常重要的字段STATUS和DATE。
在STATUS字段中,值可以是“wait”,“ok”,“2edit”或“no”,因此要获取值,我使用“SELECT * FROM table ORDER BY FIELD(request_status,'wait',' 2edit','ok','no')“
到目前为止一切顺利。但是我需要具有STATUS =“wait”的结果,处于DATE顺序。有可能吗?
我希望我已经通过了这个想法!
谢谢。
答案 0 :(得分:3)
只需添加第二个排序条件:
... ORDER BY
FIELD(request_status, 'wait', '2edit', 'ok', 'no'),
`date`
如果你不想改变request_status <> 'wait'
行的顺序,你可以这样做(但是正式地说,这没有意义,因为没有ORDER BY子句,行的顺序是正式未定义的) :
... ORDER BY
FIELD(request_status, 'wait', '2edit', 'ok', 'no'),
IF(request_status = 'wait', `date`, 0)
...但您不应该使用任何一个版本,因为这样的查询无法使用任何索引来遵守ORDER BY
子句。这是因为需要对要排序的每一行进行函数调用。
相反,您应该添加一个order
字段,并在其上添加适当的索引,并ORDER BY
此字段。然后你的最终查询将如下所示:
... ORDER BY request_status_order, `date`
如果您想遵守规范化最佳做法,请将您的状态提取到新的status
表中。使用此表加入主表。使用所需的订单索引作为此新表的主键。
CREATE TABLE statuses (
status_index INT NOT NULL PRIMARY KEY,
label VARCHAR(20) NOT NULL
);
CREATE TABLE main_table (
id INT NOT NULL PRIMARY KEY,
`date` DATETIME NOT NULL,
status_index INT NOT NULL,
other_fields VARCHAR(10),
CONSTRAINT fk_status FOREIGN KEY fk_status_idx (status_index)
REFERENCES statuses (status_index)
);
SELECT * FROM main_table
JOIN statuses USING (status_index)
ORDER BY status_index, `date`;
答案 1 :(得分:1)
按date
request_status
对数据进行排序
SELECT * FROM table
ORDER BY FIELD(request_status, 'wait', '2edit', 'ok', 'no'),
`date`
答案 2 :(得分:1)
当然这是可能的=)
看一看 http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html
SELECT * FROM table ORDER BY FIELD(request_status, 'wait', '2edit', 'ok', 'no'), `DATE` ASC|DESC
答案 3 :(得分:0)
这样的事可能有用。 if语句的第二部分无关紧要,只要它是一个日期。
select * from table
ORDER BY FIELD(request_status, 'wait', '2edit', 'ok', 'no'),
if(request_status = 'wait', date, '2013-01-01')