MySQL-按IN()中的值排序
我希望按照在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 |
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`)