2011-11-18 68 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; 

我没有测试过这个,但理论上它应该工作。