MySQL-按IN()中的值排序

MySQL-按IN()中的值排序,mysql,sql-order-by,where-clause,Mysql,Sql Order By,Where Clause,我希望按照在in()函数中输入的顺序对以下查询中返回的项进行排序 输入: SELECT id, name FROM mytable WHERE name IN ('B', 'A', 'D', 'E', 'C'); 输出: | id | name | ^--------^---------^ | 5 | B | | 6 | B | | 1 | D | | 15 | E | | 17 |

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

输入:

SELECT id, name FROM mytable WHERE name IN ('B', 'A', 'D', 'E', 'C');
输出:

|   id   |   name  |
^--------^---------^
|   5    |   B     |
|   6    |   B     |
|   1    |   D     |
|   15   |   E     |
|   17   |   E     |
|   9    |   C     |
|   18   |   C     |
有什么想法吗

表中需要另一列(数字),在其中指定排序顺序。IN子句不是这样工作的

B - 1
A - 2
D - 3
E - 4
C - 5
试试像这样的东西

... ORDER BY (CASE NAME WHEN 'B' THEN 0 WHEN 'A' THEN 1 WHEN ...
函数返回剩余字符串列表中第一个字符串的位置

但是,在性能方面,最好有一个表示排序顺序的索引列,然后按此列排序。

此处的另一个选项:

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

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';

根据您所做的工作,我发现它有点古怪,但总是在玩了一点之后才能工作。

这可能会对某些人有所帮助(p\u CustomerId在SP中传递):

描述:我想显示帐户列表。在这里,我在sp中传递一个客户id。现在,它将列出与该客户链接的帐户名,客户显示在顶部,然后是按字母顺序排列的其他帐户。

只需使用

order by INSTR( ',B,C,D,A,' ,  concat(',' , `field`, ',' ) )
避免像这样的情况

 INSTR('1,2,3,11' ,`field`) 

将以无序的结果行结束:1和11交替

每个查询的所需顺序。@Vladimir-是的,它是特定于MySQL的。问题是mysql标签。太好了,在DB切换后替换Oracle的“解码”功能。小心。任何未知属性值(不在列表中)将优先于已知值,即
字段(字母'A','C')
,列表将首先返回带有B字母的条目(假设一组记录带有
A | B | C
值)。要避免这种情况,请反转列表并使用DESC,即
字段(字母'C','A')DESC
。如何在SQL server中实现这一点。这可能比使用FIELD()函数作为建议的另一个答案要好,因为使用FIELD()将排除索引使用,但它有机会使用此方法使用索引(不过,不确定它使用索引的效果如何)这很好,但我需要指定
DESC
作为每个部分后面的方向。相等检查的值为
1
,其余的值为
0
,因此我需要先找到通过检查的值。我们发现此方法比使用
字段()慢得多
。我们可能不正确地使用了它,或者使用了太大的数据集(~22000条返回的记录),但请确保您自己进行了基准测试。
SELECT CompanyAccountId, CompanyName
FROM account
LEFT JOIN customer where CompanyAccountId = customer.AccountId
GROUP BY CompanyAccountId
ORDER BY CASE WHEN CompanyAccountId IN (SELECT AccountId 
                                          FROM customer
                                          WHERE customerid= p_CustomerId) 
                 THEN 0
                 ELSE 1
          END, CompanyName;
order by INSTR( ',B,C,D,A,' ,  concat(',' , `field`, ',' ) )
 INSTR('1,2,3,11' ,`field`)