MySQL - IN()中的ORDER BY值

Mat*_*att 101 mysql sql-order-by where-clause

我希望按照它们输入IN()函数的顺序对以下查询中返回的项进行排序.

INPUT:

SELECT id, name FROM mytable WHERE name IN ('B', 'A', 'D', 'E', 'C');
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

|   id   |   name  |
^--------^---------^
|   5    |   B     |
|   6    |   B     |
|   1    |   D     |
|   15   |   E     |
|   17   |   E     |
|   9    |   C     |
|   18   |   C     |
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Aym*_*ieh 215

SELECT id, name
FROM mytable
WHERE name IN ('B', 'A', 'D', 'E', 'C')
ORDER BY FIELD(name, 'B', 'A', 'D', 'E', 'C')
Run Code Online (Sandbox Code Playgroud)

函数返回字符串的剩余列表中的第一个字符串的位置.

但是,如果有一个表示排序顺序的索引列,然后按此列排序,则性能要好得多.

  • @Vladimir - 是的,它是特定于MySQL的.问题有mysql标签. (9认同)
  • 小心.任何未知属性值(不在列表中)将优先于已知值,即`FIELD(字母,'A','C')`,列表将首先返回带有B字母的条目(假设一组记录)用'A | B | C`值).为了避免这种情况,反转列表并使用DESC,即`FIELD(字母,'C','A')DESC`. (7认同)

joe*_*von 28

另一个选项来自:http: //dev.mysql.com/doc/refman/5.0/en/sorting-rows.html

select * 
from tablename 
order by priority='High' DESC, priority='Medium' DESC, priority='Low" DESC;
Run Code Online (Sandbox Code Playgroud)

所以在你的情况下(未经测试)将是

SELECT id, name
FROM mytable
WHERE name IN ('B', 'A', 'D', 'E', 'C')
ORDER BY name = 'B', name = 'A', name = 'D', name =  'E', name = 'C';
Run Code Online (Sandbox Code Playgroud)

根据你正在做的事情,我发现它有点古怪但是在玩了一下之后总是让它起作用.