2016-03-02 52 views
0

我試圖訂購一些數據並使用ORDER BY FIELD。給定ID的順序看起來不錯,但是當我在數據庫中添加另一條記錄時,這條記錄只是在有序ID的數據前面得到。當我添加另一條記錄時,我希望該記錄是排序後的最後一條記錄。我用的代碼如下:MySql按字段排序最後上傳首先在訂購ID的前面

$result = mysqli_query($conn, 'SELECT * FROM echipa ORDER BY FIELD(id_profesor, 14,17,16,24,25,22,26,19,20,21,18,23)'); 
+1

爲什麼不添加日期字段'created_at'? –

+1

或至少一個專門用於排序的字段。 – 2016-03-02 21:34:07

回答

0

您可以使用在order byif聲明:

SELECT * 
FROM echipa 
ORDER BY IF(FIELD(id_profesor, 14,17,16,24,25,22,26,19,20,21,18,23)=0,1,0), 
    FIELD(id_profesor, 14,17,16,24,25,22,26,19,20,21,18,23) 

的問題是對非匹配的記錄field返回0,這將返回在的頂部名單。這迫使記錄未找到底部。

+0

效率不高,你知道在這種情況下如何處理索引嗎? – 2016-03-02 21:35:11

+0

@Dagon - 我不經常親自使用'field'(如果有的話) - 這只是用這種特定設計強制執行這種訂單的一種方式。如果表現是一個問題,也許重構表格會更有意義。 – sgeddes

+0

@Dagon。 。 。無論如何,索引不會被用於這種類型的,所以這實際上不是一個考慮因素。 –

1

一個解決方案,你不必重複表達是對0轉換爲NULL,然後NULL別的東西:

ORDER BY COALESCE(NULLIF(FIELD(id_profesor, 14,17,16,24,25,22,26,19,20,21,18,23), 0), 9999) 

另一種是使用的事實,降序排序看跌期權NULL的最後:

ORDER BY FIELD(id_profesor, 14,17,16,24,25,22,26,19,20,21,18,23) DESC 

但是,您可能要扭轉列表爲了保持原來的順序行。

或者,如果你真的想成爲幻想,你可以做這樣的事情:

ORDER BY - NULLIF(FIELD(id_profesor, 14,17,16,24,25,22,26,19,20,21,18,23), 0) DESC 

我會考慮的意圖在這種情況下,相當不可思議。