先按特定字段值sorting

我有一个3列的表:

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

我想要使​​用prioritysorting结果集,但是首先那些具有name=core行,即使优先级较低。 结果应该是这样的

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

还有MySQL的FIELDfunction 。

如果你想完整的sorting所有可能的值:

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

如果你只关心“核心”是第一个,其他的价值观并不重要:

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

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

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

不过这里有一些注意事项:

首先,我很确定这是仅用于mysql的function – 问题是标记为mysql,但你永远不知道。

其次,注意FIELD()是如何工作的:它返回值的基于1的索引 – 在FIELD(priority, "core")的情况下,如果“core”是值,它将返回1。 如果该字段的值不在列表中,则返回 。 这就是为什么DESC是必要的,除非你指定了所有可能的值。

一般你可以做

 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 ,您可以通过该结果进行sorting。

优先select特定行的一种方法是在其优先级上添加大数字。 你可以用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 id, name, priority from table a order by case when name='core' then -1 else priority end asc, priority asc 
 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') 

这适用于我使用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