只需添加第二个排序条件:
... 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`;