可以说我有下表。
我想得到所有的朋友,但我希望ID 5成为列表中的第一项。我不在乎收到其余物品的顺序。
所需的查询结果将是:
friends
-------
id name
5 nahum
1 moshe
2 haim
3 yusuf
4 gedalia
6 dana
我怎样才能做到这一点?
使用Mysql5.1.x。
谢谢!
Answers:
select id,name
from friends
order by id=5 desc
(假设您不关心其余的顺序,否则,例如,通过id asc进行休息)
select id,name
from friends
order by id=5 desc, id asc
试试这个:
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
我现在无法访问MySQL进行测试,因此可能会被逆转...但是您可以使用以下事实:布尔值也可以排序,并且可以有多个排序字段。
SELECT ... ORDER BY id != 5, id
(您可能必须编写id = 5
,我不记得TRUE是在FALSE之前还是之后排序。)
编辑:哦,我刚刚读到您不关心其余顺序,在这种情况下,我衷心推荐@Richard的答案。
id=5 desc
,因为当列中包含空值时,!=5
将空值放在第一位
如果要对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'或'f',具体取决于您的列值是否等于期望值(5),因此,排序依据将首先对't'列进行排序,然后对休息。
您应该使用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;
这比
这有点丑陋,因为它具有代码重复功能,但是可以做到这一点:
select .... where id = 5
union
select .... where not id = 5
order by
,它将对整个联合进行排序。