先按特定字段值sorting
我有一个3列的表:
id | name | priority -------------------- 1 | core | 10 2 | core | 9 3 | other | 8 4 | board | 7 5 | board | 6 6 | core | 4
我想要使用priority
sorting结果集,但是首先那些具有name=core
行,即使优先级较低。 结果应该是这样的
id | name | priority -------------------- 6 | core | 4 2 | core | 9 1 | core | 10 5 | board | 6 4 | board | 7 3 | other | 8
还有MySQL的FIELD
function 。
如果你想完整的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中比较的结果是0
或1
,您可以通过该结果进行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