mysql SQL:首先是特定项,然后对其余项进行排序

时间:2011-03-24 10:49:40

标签: mysql sql

假设我有下表。

我希望得到所有朋友,但我希望id 5成为列表中的第一项。我不关心我收到剩余物品的顺序。

所需的查询结果为:

friends
-------

id    name

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

我该怎么做?

使用Mysql 5.1.x。

谢谢!

7 个答案:

答案 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进行排序。)

编辑:哦,我刚刚读到你不关心其余的顺序,在这种情况下,我衷心推荐@ Richard的回答。

答案 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;

这比

更好
  • id = something,按id asc
  • 排序
  • 按件种顺序然后是1,当something_else然后2结束desc

答案 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