首先按特定字段值排序

我有一张三栏的桌子:

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
174441 次浏览

一种方法是:

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

给予特定行优先权的一种方法是在它们的优先权中添加一个大的数字。你可以使用 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

一般来说你可以做到

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,所以您可以根据这个结果进行排序。

还有 MySQL FIELD函数

如果希望对所有可能的值进行完全排序:

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

如果你想先按“ core”进行排序,其他字段按正常顺序排序:

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

不过,这里有一些警告:

首先,我非常肯定这是 mysql-only 功能-这个问题被标记为 mysql,但是你永远不会知道。

第二,注意 FIELD()是如何工作的: 它返回值的 以一为基础的索引-对于 FIELD(priority, "core"),如果“ core”是值,它将返回1。如果字段的值不在列表中,则返回 。这就是为什么 DESC是必需的,除非您指定所有可能的值。

使用 Postgres 9 + 对我来说很有效:

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

这样做:

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

附加 + 0意味着:

0, 10, 11, 2, 3, 4

变成:

0, 2, 3, 4, 10, 11
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')

使用这个:

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