2009-02-28 56 views
2

我有一個小問題。我正在使用SQL數據庫的結果填充選擇標記。我想要的是最後一個作爲頂部條目添加,其餘按字母順序排序。按照字母順序排列所有結果的SQL查詢除外?

因此,這將返回:

*----------*-------------* 
developerID|developerName 
*----------*-------------* 
| 40  | ZZZ Dev  | 
| 39  | A Dev  | 
| 38  | Be New Dev | 
*----------*-------------* 

目前,它只是選擇降序排列所有條目:

"SELECT developerName, developerID FROM developer ORDER BY developerID DESC" 

這很好,但沒有可用的,因爲我想。

是我想要使用純MySQL的可能嗎?

回答

9

假設加入開發者在定義列developerAdded(某種形式的時間戳):

SELECT developerName, developerID, 1 AS ordering 
    FROM developer 
    WHERE developerAdded = (SELECT MAX(developerAdded) 
           FROM developer) 
UNION 
SELECT developerName, developerID, 2 AS ordering 
    FROM developer 
    WHERE developerAdded != (SELECT MAX(developerAdded) 
           FROM developer) 
ORDER BY ordering, developername; 

如果有其他一些神奇的方法來確定最近添加的開發商(如最大developerID),調整相應的子查詢。

請注意,即使多個開發人員滿足「最近添加的」標準,此查詢也可以正常工作;它們在開發者已經出現較長的時間之前以字母順序出現。


由於最近添加的開發商具有最大developerID,修訂後的查詢應該是:

SELECT developerName, developerID, 1 AS ordering 
    FROM developer 
    WHERE developerID = (SELECT MAX(developerID) FROM developer) 
UNION 
SELECT developerName, developerID, 2 AS ordering 
    FROM developer 
    WHERE developerID != (SELECT MAX(developerID) FROM developer) 
ORDER BY ordering, developername; 
+0

完美。最近添加的開發者是max developerID,並不需要在那裏存儲日期。但是,這正是我想要的。非常感謝喬納森。 :) – different 2009-02-28 22:36:45

0
SELECT developerName, developerID 
    FROM developer 
    ORDER BY developerID = {last_used},developerID DESC 

或者其中的一些變體。這個想法是做兩部分,第一部分拉出最後一部分。

- MarkusQ

上編輯:反轉感(不加),因爲你想讓它在頂部。

第二次編輯,回覆了我對編輯問題的第一次編輯。

+0

您的排序是降序的developerID;請求是字母的,所以應該按照developerName的升序排列,不應該嗎? 「製造」欄是答案的一部分;你正在使用一個布爾值並假設(可能正確)那個TRUE命令在FALSE之前。 – 2009-02-28 22:38:56

+0

我在編輯問題時經歷了一些編輯連環,然後放棄了。在MySQL true == 1和false == 0中,所以這種形式的東西應該讓他得到他想要的東西,但細節取決於他究竟想要什麼。 – MarkusQ 2009-02-28 22:44:07

+0

不要擔心編輯,這只是我意識到我發佈了太少的初始信息。人爲錯誤。 :) – different 2009-02-28 22:50:51

2

我認爲要做到這一點的最好辦法是隻是兩個查詢。顯示最近的項目,與常規字母列表分開顯示(它會顯示兩次)。這很容易做到,無論如何可以說是更直觀,更實用。否則,如果你真的堅持以你的方式和單個SQL查詢,你可以使用UNION ALL和INTERSECT或EXCEPT來做點什麼。但是MySQL不保留UNION結果中的任何順序(見http://dev.mysql.com/doc/refman/5.1/en/union.html),所以這樣的查詢很可能會變得很難。

1

我建議不要試圖改變列表中項目的排序順序,因爲這會改變用戶對列表的「預期行爲」。

如果該頁面的最常見用途通常處理「最後添加的」名稱,則可以在列表中將該選項設置爲「默認」。因此,當頁面出現時,最後添加的條目已經在列表中被選中 - 但是如果它們打開列表,所有條目仍然按字母順序排列,並且其行爲將像他們預期的那樣。

這樣,您的查詢保持簡單,但您也實現了「可用性」目標。

1

另一種解決方案WHERE main是設置FIRST項目的時間戳,其他項目按照地名按字母順序排序。

ORDER BY main=(SELECT MAX(main) FROM places WHERE user_ID = 7) DESC,place ASCSELECT ID,place,main FROM places WHERE user_ID = 7 
相關問題