130

我有一个包含 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
4

8 回答 8

223

还有MySQLFIELD功能

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

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 独有的功能 - 问题被标记为 mysql,但你永远不知道。

其次,注意如何FIELD()工作:它返回值的从1 开始的索引- 在 的情况下FIELD(priority, "core"),如果 "core" 是值,它将返回 1。如果字段的值不在列表中,则返回DESC除非您指定所有可能的值,否则这就是必要的原因。

于 2014-08-21T18:07:45.467 回答
102

一般来说你可以做

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 中的比较结果是 0or 1,因此您可以按该结果排序。

于 2012-12-31T16:52:45.160 回答
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

于 2012-12-31T16:52:17.810 回答
6

这适用于我使用 Postgres 9+:

SELECT *
FROM your_table
ORDER BY name = 'core' DESC, priority DESC
于 2015-11-27T20:11:16.887 回答
3

一种方法是:

select id, name, priority from table a
order by case when name='core' then -1 else priority end asc, priority asc
于 2012-12-31T16:52:04.407 回答
1
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')
于 2016-11-26T09:45:42.147 回答
0

做这个:

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

附加 +0 将意味着:

0, 10, 11, 2, 3, 4

变成:

0, 2, 3, 4, 10, 11
于 2016-06-23T09:44:42.707 回答
0

用这个:

SELECT * 
FROM tablename 
ORDER BY priority desc, FIELD(name, "core")
于 2019-09-23T08:01:11.880 回答