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