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
如果要对所有可能的值进行完整排序:
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
除非您指定所有可能的值,否则这是必要的原因.
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
,您可以通过该结果进行排序.
优先考虑特定行的一种方法是向其优先级添加大量数字.您可以使用以下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
这对我使用 Postgres 9+ 有效:
SELECT *
FROM your_table
ORDER BY name = 'core' DESC, priority DESC
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
102751 次 |
最近记录: |