只需添加第二個排序條件:
... 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`;
ORDER BY CASE WHEN ... THEN ... END – Strawberry