假设我有下表。
我希望得到所有朋友,但我希望id 5成为列表中的第一项。我不关心我收到剩余物品的顺序。
所需的查询结果为:
friends
-------
id name
5 nahum
1 moshe
2 haim
3 yusuf
4 gedalia
6 dana
我该怎么做?
使用Mysql 5.1.x。
谢谢!
答案 0 :(得分:128)
select id,name
from friends
order by id=5 desc
(鉴于您不关心其余的顺序,否则,例如通过id asc 休息)
select id,name
from friends
order by id=5 desc, id asc
答案 1 :(得分:44)
试试这个:
select id,name
from friends
order by case when id=5 then -1 else id end
如果你有多个,你可以做:
select id,name
from friends
order by case when id in (5,15,25) then -1 else id end,id
答案 2 :(得分:3)
我现在无法访问MySQL进行测试,所以它可能会被颠倒......但是你可以使用Booleans排序的事实,并且你可以有几个排序字段。
SELECT ... ORDER BY id != 5, id
(您可能需要写id = 5
,我不记得是否在FALSE之前或之后对TRUE进行排序。)
答案 3 :(得分:1)
如果您想对UNION查询执行相同操作,例如,如果您有:
select id,name
from friends
UNION
select id,name
from friends
order by id=5 desc
...你会在PostgreSQL中得到一个例外:
只能使用结果列名,而不能使用表达式或函数。提示:将表达式/函数添加到每个SELECT,或将UNION移动到from子句
要解决此问题,您可以使用以下内容:
select id,name, (id=5) AS is_five
from friends
UNION
select id,name, (id=5) AS is_five
from friends
order by is_five DESC, id DESC
表达式(id = 5)将返回't'OR'f',具体取决于您的列值是否等于预期值(5),因此order by将首先排序't'列,其余的。
答案 4 :(得分:0)
你应该使用MySQL的ORDER BY FIELD子句来解决这个问题。虽然答案已被接受,但这是一个更好的解决方案。
select 1 id, 'Zeta' order_col union all
select 2 id, 'Alpha' order_col union all
select 3 id, 'Gamma' order_col union all
select 4 id, 'Phi' order_col union all
select 5 id, 'Delta' order_col union all
select 6 id, 'Delta' order_col union all
select 7 id, 'Alpha' order_col union all
select 8 id, 'Gamma' order_col union all
select 9 id, 'Zeta' order_col union all
select 10 id, 'Phi' order_col
order by field (order_col, 'Alpha', 'Gamma', 'Phi', 'Delta', 'Zeta'), id;
这比
更好答案 5 :(得分:0)
您可以在MySQL中使用field()
。
select id,name from friends order by field(id,5,id)
field()中的第一个参数表示您要与之排序的字段,其余为排序字段。
因此5将首先排序,其余的将根据id排序(不带5)。如果您想让5,1,3位于最前面,就可以像field(id,5,1,3,id)
一样。
5最后按field(id,id,5)
进行排序。第二个ID也将从其中排除5个。
答案 6 :(得分:-7)
这有点难看,因为它有代码重复,但它可以解决问题:
select .... where id = 5
union
select .... where not id = 5