【发布时间】:2011-03-24 10:49:39
【问题描述】:
假设我有下表。
我想获得所有朋友,但我希望 id 5 成为列表中的第一项。我不在乎我收到其余物品的顺序。
所需的查询结果将是:
friends
-------
id name
5 nahum
1 moshe
2 haim
3 yusuf
4 gedalia
6 dana
我该怎么做?
使用 Mysql 5.1.x.
谢谢!
【问题讨论】:
假设我有下表。
我想获得所有朋友,但我希望 id 5 成为列表中的第一项。我不在乎我收到其余物品的顺序。
所需的查询结果将是:
friends
-------
id name
5 nahum
1 moshe
2 haim
3 yusuf
4 gedalia
6 dana
我该怎么做?
使用 Mysql 5.1.x.
谢谢!
【问题讨论】:
select id,name
from friends
order by id=5 desc
(假设你不关心其余的顺序,否则,例如 rest by 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 会将空值放在首位
您可以在 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。
【讨论】:
如果您想对 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),因此 order by 将首先对“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,它会对整个联合进行排序。