2013-06-28 88 views
1

我在MySQL中有一個表,它有兩個非常重要的字段STATUS和DATE。使用按字段確定字段的順序,但在日期字段中保持順序 - MySQL PHP

在STATUS字段中,值可以是「等待」,「OK」,「2edit」或「no」,所以要獲取我使用的值「SELECT * FROM ORDER BY FIELD(request_status,'wait' 「2edit」,「OK」,「無」)」

到目前爲止那麼好,但我需要一個有狀態的結果=‘等待’,是按照日期順序。這可能嗎?

我希望我已經通過了主意!

謝謝。

+1

ORDER BY CASE WHEN ... THEN ... END – Strawberry

回答

1

通常你可以根據對數據進行排序0通過request_status

SELECT * FROM table 
ORDER BY FIELD(request_status, 'wait', '2edit', 'ok', 'no'), 
     `date` 
+0

+但請注意,所有'request_status'es將按照日期升序排列。不只是「等待」。但是,沒有其他選擇。這是答案。 –

0

這樣的事情可能會奏效。 if語句的第二部分不重要,只要它是一個日期即可。

select * from table 
ORDER BY FIELD(request_status, 'wait', '2edit', 'ok', 'no'), 
if(request_status = 'wait', date, '2013-01-01') 

SQL Fiddle

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`; 
+0

我喜歡規範化,因爲在需要性能時這確實是需要的。 –