首先按特定字段值排序


89

我有一个包含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

Answers:


155

还有MySQLFIELD函数

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

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的功能-问题被标记为mysql,但您永远不会知道。

其次,请注意其FIELD()工作原理:它返回值的从一开始的索引-在的情况下FIELD(priority, "core"),如果“ core”是值,它将返回1。如果该字段的值不在列表中,则返回。这就是为什么DESC除非您指定所有可能的值,否则是必需的。


5
大约5年后,我更改了对此答案的接受答案,因为它更干净,更快。
奥米德

db2是否等效?
Cyber​​monk

它对我有用,想再问一个有关如何处理的问题,如果“优先级”列中包含诸如“ earth core”,“ new board”等值。 %核心%?
Jayanth Suvarna

@JayanthSuvarna:查看MySQL FIELD()文档,我很确定没有任何方法可以将其评估为子字符串,因为每个参数都必须是某种字符串。可能会有一些字符串操作功能可能会有所帮助,但我不确定。
Nerdmaster

谢了哥们。你让我今天一整天都感觉很好。
BEingprabhU 18/09/12

92

通常你可以做

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,因此您可以按该结果进行排序。


1
做什么12在这里的意思?
Niraj Chauhan 2013年

1
我大约有3000行要排序。以我为例,与该解决方案相比,stackoverflow.com / questions / 958627 /…上的@ Ayman-Hourieh解决方案花费了一半的时间。
nightlyop 2014年

@nightlyop:好人。只有一个注意事项:更快的解决方案是特定于MySQL的。
juergen d 2015年4

12仅仅2号我用对数据进行排序。可能是3and4或其他。
juergen d 2016年

什么时候有%WHERE条款?喜欢. . . WHERE name LIKE '%sth%' . . .吗?stackoverflow.com/questions/41303379/...

6

优先选择特定行的一种方法是在其优先级上添加大量数字。您可以使用以下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


5

这适用于我使用Postgres 9+的情况:

SELECT *
FROM your_table
ORDER BY name = 'core' DESC, priority DESC

关心解释-1?错误+ Postgres版本?
Vojtech Vitek

3

一种方法是:

select id, name, priority from table a
order by case when name='core' then -1 else priority end asc, priority asc

1
这样会不会失去core行的顺序?
mellamokb

1
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')

3
尽管您的代码可能是该问题的答案,但最好对此提供一些解释。
Mehraban '16

0

做这个:

SELECT * FROM table ORDER BY column `name`+0 ASC

附加+0表示:

0, 10, 11, 2, 3, 4

变成:

0, 2, 3, 4, 10, 11

此技术用于将字符串转换为数字。它没有解决OP的问题。(但是,没有看到的数据类型priority,我不能说它是否应该包含在完整解决方案中。)
Rick James

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.