MySQL - IN() 中的 ORDER BY 值

Posted

技术标签:

【中文标题】MySQL - IN() 中的 ORDER BY 值【英文标题】:MySQL - ORDER BY values within IN() 【发布时间】:2010-10-31 19:30:06 【问题描述】:

我希望按照输入 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     |

有什么想法吗?

【问题讨论】:

【参考方案1】:

只需使用

order by INSTR( ',B,C,D,A,' ,  concat(',' , `field`, ',' ) )

避免这种情况

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

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

【讨论】:

【参考方案2】:

这可能对某人有帮助(p_CustomerId 在 SP 中传递):

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;

说明:我想显示帐户列表。在这里,我在 sp 中传递了一个客户 ID。现在它将列出与该客户关联的帐户的帐户名称显示在顶部,然后按字母顺序显示其他帐户。

【讨论】:

【参考方案3】:

这里的另一个选择: 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;

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

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

取决于你在做什么,我发现它有点古怪,但在玩了一会儿之后总能让它工作。

【讨论】:

这可能比使用 field() 函数作为建议的另一个答案更好,因为使用 field() 将排除索引的使用,但它有机会使用此方法使用索引(不确定效果如何不过它可能会使用索引) 这很好,但我需要在每个部分之后指定DESC 作为方向。相等性检查的值为1,其余的都是0,所以我需要通过检查的那个,首先出现。 我们发现这种方法比使用FIELD()很多。我们可能使用不当或数据集太大(约 22,000 条返回记录),但请确保您自己进行基准测试。【参考方案4】:
SELECT id, name
FROM mytable
WHERE name IN ('B', 'A', 'D', 'E', 'C')
ORDER BY FIELD(name, 'B', 'A', 'D', 'E', 'C')

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

但是,拥有一个代表您的排序顺序的索引列,然后按此列排序,在性能方面要好得多。

【讨论】:

@Vladimir - 是的,它是特定于 MySQL 的。问题有mysql标签。 很好,替换了数据库切换后Oracle的“解码”功能。 小心。任何未知属性值(不在列表中)将优先于已知值,即FIELD(letter, 'A', 'C'),列表将首先返回带有 B 字母的条目(假设一组记录具有 A | B | C 值)。为避免这种情况,请反转列表并使用 DESC,即FIELD(letter, 'C', 'A') DESC 我如何在 SQL Server 中实现这一点。【参考方案5】:

试试类似的东西

... ORDER BY (CASE NAME WHEN 'B' THEN 0 WHEN 'A' THEN 1 WHEN ...

【讨论】:

【参考方案6】:

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

B - 1
A - 2
D - 3
E - 4
C - 5

【讨论】:

所需的订单可能是每个查询。

以上是关于MySQL - IN() 中的 ORDER BY 值的主要内容,如果未能解决你的问题,请参考以下文章

MySQL WHERE IN 查询 - ORDER BY 匹配

select in排序 mysql select in (array) order by array

ORDER BY 子句“IN()”中指定的值,但在泛型 SQL 和 Informix 中

mysql Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nona

[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause 的问题 MySQL

[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause 的问题 MySQL