我有一个包含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
答案 0 :(得分:102)
如果您想要对所有可能的值进行完整排序:
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-only功能 - 问题是标记为mysql,但你永远不知道。
其次,请注意FIELD()
的工作原理:它返回值的从一开始的索引 - 在FIELD(priority, "core")
的情况下,如果DESC
,它将返回1 “核心”是价值。如果字段的值不在列表中,则返回零。这就是为什么{{1}}是必要的,除非您指定所有可能的值。
答案 1 :(得分:87)
一般来说,你可以做到
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
,您可以按该结果排序。
答案 2 :(得分:6)
优先选择特定行的一种方法是在其优先级中添加一个大数字。您可以使用CASE
语句执行此操作:
select id, name, priority
from mytable
order by priority + CASE WHEN name='core' THEN 1000 ELSE 0 END desc
答案 3 :(得分:3)
一种方法是:
select id, name, priority from table a
order by case when name='core' then -1 else priority end asc, priority asc
答案 4 :(得分:3)
这适用于我使用Postgres 9 +:
SELECT *
FROM your_table
ORDER BY name = 'core' DESC, priority DESC
答案 5 :(得分:2)
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')
答案 6 :(得分:0)
这样做:
SELECT * FROM table ORDER BY column `name`+0 ASC
追加+0意味着:
0, 10, 11, 2, 3, 4
成为:
0, 2, 3, 4, 10, 11
答案 7 :(得分:0)
使用此功能:
SELECT *
FROM tablename
ORDER BY priority desc, FIELD(name, "core")