首先按特定字段值排序

时间:2012-12-31 16:49:33

标签: mysql sql select sql-order-by

我有一个包含3列的表格:

id | name | priority
--------------------
 1 | core  |   10
 2 | core  |   9
 3 | other |   8
 4 | board |   7
 5 | board |   6
 6 | core  |   4

我想使用priority对结果集进行排序,但首先是那些name=core的行,即使优先级较低。结果应如下所示

id | name | priority
--------------------
 6 | core  |   4
 2 | core  |   9
 1 | core  |   10
 5 | board |   6
 4 | board |   7
 3 | other |   8

8 个答案:

答案 0 :(得分:102)

还有MySQL FIELD function

如果您想要对所有可能的值进行完整排序:

SELECT id, name, priority
FROM mytable
ORDER BY FIELD(name, "core", "board", "other")

如果您只关心“核心”是第一位且其他值无关紧要:

SELECT id, name, priority
FROM mytable
ORDER BY FIELD(name, "core") DESC

如果您想先按“核心”排序,而按正常排序顺序排序其他字段:

SELECT id, name, priority
FROM mytable
ORDER BY FIELD(name, "core") DESC, priority

但这里有一些警告:

首先,我很确定这只是mysql-only功能 - 问题是标记为mysql,但你永远不知道。

其次,请注意FIELD()的工作原理:它返回值的从一开始的索引 - 在FIELD(priority, "core")的情况下,如果DESC,它将返回1 “核心”是价值。如果字段的值不在列表中,则返回。这就是为什么{{1}}是必要的,除非您指定所有可能的值。

答案 1 :(得分:87)

一般来说,你可以做到

select * from your_table
order by case when name = 'core' then 1 else 2 end,
         priority 

特别是在MySQL中,您也可以

select * from your_table
order by name <> 'core',
         priority 

由于MySQL中的比较结果为01,您可以按该结果排序。

答案 2 :(得分:6)

优先选择特定行的一种方法是在其优先级中添加一个大数字。您可以使用CASE语句执行此操作:

  select id, name, priority
    from mytable
order by priority + CASE WHEN name='core' THEN 1000 ELSE 0 END desc

演示:http://www.sqlfiddle.com/#!2/753ee/1

答案 3 :(得分:3)

一种方法是:

select id, name, priority from table a
order by case when name='core' then -1 else priority end asc, priority asc

答案 4 :(得分:3)

这适用于我使用Postgres 9 +:

SELECT *
FROM your_table
ORDER BY name = 'core' DESC, priority DESC

答案 5 :(得分:2)

SELECT * FROM cars_new WHERE status = '1' and car_hide !='1' and cname IN ('Executive Car','Saloon','MPV+','MPV5') ORDER BY FIELD(cname, 'Executive Car', 'Saloon','MPV+','mpv5')

答案 6 :(得分:0)

这样做:

SELECT * FROM table ORDER BY column `name`+0 ASC

追加+0意味着:

0, 10, 11, 2, 3, 4

成为:

0, 2, 3, 4, 10, 11

答案 7 :(得分:0)

使用此功能:

SELECT * 
FROM tablename 
ORDER BY priority desc, FIELD(name, "core")