mysql:先指定要排序的项,然后对其余项排序

kr98yfug  于 2021-06-21  发布在  Mysql
关注(0)|答案(7)|浏览(281)

假设我有下表。
我想得到所有的朋友,但我希望id 5是列表中的第一项。我不在乎我收到其余物品的订单。
所需的查询结果将是:

friends
-------

id    name

5     nahum
1     moshe
2     haim
3     yusuf
4     gedalia
6     dana

我该怎么做?
使用mysql 5.1.x。
谢谢!

ogsagwnx

ogsagwnx1#

这有点难看,因为它有代码重复,但它做到了:

select .... where id = 5 
union
select .... where not id = 5
xjreopfe

xjreopfe2#

你可以用 field() 在mysql中。

select id,name from friends order by field(id,5,id)

field()中的第一个参数表示要排序的字段,其余的是排序。
所以5将首先排序,其余的从id排序(没有5)。你可以这样做 field(id,5,1,3,id) 如果你想让5,1,3排在前面。
最后可以选择5个进行排序 field(id,id,5) . 第二个id也会将5排除在外。

uqcuzwp8

uqcuzwp83#

如果要对联合查询执行相同的操作,例如:

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”列排序,然后对其余列排序。

of1yzvn4

of1yzvn44#

您应该使用mysql的orderbyfield子句来解决这个问题。虽然,这个问题的答案已经被接受,但这里有一个更好的解决方案。

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;

这比
id=某物,按id排序asc
按大小写排序,然后是1,然后是2,结束描述

ve7v8dk2

ve7v8dk25#

试试这个:

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
u91tlkcl

u91tlkcl6#

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
flvlnr44

flvlnr447#

我现在无法访问mysql进行测试,所以它可能会被反转。。。但是你可以利用布尔值也可以排序的事实,你可以有几个排序字段。

SELECT ... ORDER BY id != 5, id

(你可能得写信。) id = 5 ,我记不清trues是在false之前还是之后排序。)
编辑:哦,我刚读到你不在乎剩下的顺序,在这种情况下,我衷心推荐@richard的答案。

相关问题