首先按特定字段值排序

Omi*_*mid 69 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
Run Code Online (Sandbox Code Playgroud)

我想使用,priority但首先是那些name=core即使具有较低优先级的行也可以对结果集进行排序.结果应该是这样的

id | name | priority
--------------------
 6 | core  |   4
 2 | core  |   9
 1 | core  |   10
 5 | board |   6
 4 | board |   7
 3 | other |   8
Run Code Online (Sandbox Code Playgroud)

Ner*_*ter 118

还有MySQL FIELD功能.

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

SELECT id, name, priority
FROM mytable
ORDER BY FIELD(name, "core", "board", "other")
Run Code Online (Sandbox Code Playgroud)

如果您只关心"核心"是第一个而其他值无关紧要:

SELECT id, name, priority
FROM mytable
ORDER BY FIELD(name, "core") DESC
Run Code Online (Sandbox Code Playgroud)

如果要先按"核心"排序,则按正常排序顺序排序其他字段:

SELECT id, name, priority
FROM mytable
ORDER BY FIELD(name, "core") DESC, priority
Run Code Online (Sandbox Code Playgroud)

不过,这里有一些警告:

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

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

  • 大约5年后,我改变了对这一个的接受答案,因为它更清洁,更快. (5认同)

jue*_*n d 87

一般来说你可以做到

select * from your_table
order by case when name = 'core' then 1 else 2 end,
         priority 
Run Code Online (Sandbox Code Playgroud)

特别是在MySQL中你也可以这样做

select * from your_table
order by name <> 'core',
         priority 
Run Code Online (Sandbox Code Playgroud)

由于MySQL中的比较的结果是要么 0或者1,您可以通过该结果进行排序.


mel*_*okb 6

优先考虑特定行的一种方法是向其优先级添加大量数字.您可以使用以下CASE声明执行此操作:

  select id, name, priority
    from mytable
order by priority + CASE WHEN name='core' THEN 1000 ELSE 0 END desc
Run Code Online (Sandbox Code Playgroud)

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


Voj*_*tek 6

这对我使用 Postgres 9+ 有效:

SELECT *
FROM your_table
ORDER BY name = 'core' DESC, priority DESC
Run Code Online (Sandbox Code Playgroud)