我在 MySQL 中有一个表,它有两个非常重要的字段 STATUS 和 DATE。
在 STATUS 字段中,值可以是“wait”、“ok”、“2edit”或“no”,因此要获取值,我使用“SELECT * FROM table ORDER BY FIELD(request_status, 'wait', '2edit', '好的','不')”
到目前为止,一切都很好。但我需要 STATUS = "wait" 的结果按 DATE 顺序排列。可能吗?
我希望我已经通过了这个想法!
谢谢你。
只需添加第二个排序条件:
... ORDER BY
FIELD(request_status, 'wait', '2edit', 'ok', 'no'),
`date`
如果您不想更改 where 行的顺序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`;
您通常可以根据排序date后的数据对数据进行排序request_status
SELECT * FROM table
ORDER BY FIELD(request_status, 'wait', '2edit', 'ok', 'no'),
`date`
当然这是可能的 =)
看看 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
这样的事情可能会奏效。if 语句的第二部分无关紧要,只要它是一个日期。
select * from table
ORDER BY FIELD(request_status, 'wait', '2edit', 'ok', 'no'),
if(request_status = 'wait', date, '2013-01-01')