2011-11-18 53 views
1

我有一個表,它是國家的名單,有兩個字段,ID(int)和COUNTRY_NAME。我需要寫一個查詢,可以提取按字母順序排列的國家列表,但美國的記錄在頂端。我怎樣才能做到這一點?假設美國記錄的ID = 100。MySQL的,按字母順序排序,出現異常

+0

正如我討厭它的網站做到這一點,當一個網站的用戶。它作爲網站所有者並不關心來自其他地方的訪問者(所以爲什麼要問)。只有兩個選項「美國」和「世界其他地方」;-) - 無論如何我的塔彭絲。 –

回答

5
select * 
    from country 
order by case when id = 100 then 0 else 1 end, country_name 

請注意。

該解決方案不同於其他在某些方面

  • 的結合的方式提出。 UNION的默認行爲是刪除重複項,這可能會或可能不需要(Unions in MySQL)。此外,除非ID被索引,你將有執行時間的兩倍
  • 「選擇的東西,你就可以選」是好的,但返回額外的數據,並根據這可能是不希望接收框架。
0
(SELECT * 
FROM countries 
WHERE id = 100) 
UNION 
(SELECT * 
FROM countries 
WHERE id != 100 
ORDER BY country_name) 

不一定是最好的辦法。我更願意在使用它的時候在頂部對美國進行硬編碼,在模型層面上。

1
select (case when id = 100 then 1 else 0) presort, country_name from countries order by presort desc, country_name asc 

選擇一個標誌別名presort,對於id = 100爲1,對於其他任何情況爲0。選定的行然後按降序進行排序,首先將id = 100,然後按pre_name爲0時的country_name升序排序,對於所有其他id,情況就是如此。

+0

您能否請求包含查詢的解釋? –

+0

@ N.N。當然。 :)我希望這是可以理解的。 – flesk

0

使用聯合執行兩個單獨的查詢。

select id, country_name from table where id=100 
union 
select id, country_name from table where id!=100 order by country_name desc; 

我沒有測試過這個,但理論上它應該工作。