按mysql中select语句“in”子句中的值顺序排序
Posted
技术标签:
【中文标题】按mysql中select语句“in”子句中的值顺序排序【英文标题】:Sort by order of values in a select statement "in" clause in mysql 【发布时间】:2011-01-12 04:54:16 【问题描述】:我正在从具有整数 id 值的大表(数百万行)中选择一组帐户记录。从某种意义上说,作为一个基本的查询。我在做什么我们构建一个大的逗号分隔列表,并将其作为“in”子句传递到查询中。现在结果是完全无序的。我想做的是按照“in”子句中的值的顺序返回结果。
我假设我必须构建一个临时表并改为执行连接,我想避免这种情况,但可能无法做到。
想法?现在查询的大小上限为每个大约 60k,因为我们正试图限制输出大小,但它可能是任意大的,从实际的角度来看,这可能会排除“in”查询,如果不是物理的。
提前致谢。
【问题讨论】:
类似于***.com/questions/1869063/customised-ordering-in-sql 【参考方案1】:其实这样更好:
SELECT * FROM your_table
WHERE id IN (5,2,6,8,12,1)
ORDER BY FIELD(id,5,2,6,8,12,1);
这是 FIELD 文档:
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_field
【讨论】:
如果 in 子句中的值是由查询而不是静态列表生成的怎么办?我们将如何遵循这个命令? @Sumith OP 的整个问题是你已经在 IN 子句中有一个你想要遵循的静态顺序。如果你没有静态订单,那么 ORDEY BY 子句就没有什么可遵循的了。希望这是有道理的【参考方案2】:有点诡计……
SELECT * FROM your_table
WHERE id IN (5,2,6,8,12,1)
ORDER BY FIND_IN_SET(id,'5,2,6,8,12,1') DESC;
请注意,find_in_set 中的 ID 列表是一个字符串,所以它被引用了。 另请注意,如果没有 DESC,它们的结果将按列表指定的反向顺序返回。
【讨论】:
【参考方案3】:如果您的查询是 60K,则表明您的操作方式错误。
除了使用 ORDER BY 子句之外,没有其他方法可以对结果集进行排序。通过再次列出 IN 子句中的所有元素,您可以在订单中有一个复杂的 CASE 子句,但是您的查询可能是 120K。
我知道您不想这样做,但是您应该将 IN 子句中的值放在一个表或临时表中并加入它。您还可以在临时表中包含一个 SortOrder 列,并按此排序。像联接这样的数据库。这样做将有助于您的查询执行良好。
【讨论】:
【参考方案4】:这是我为 mysql 8.0 得到的。这似乎与上述答案相反。
按照与指定列表相同的顺序排序:
SELECT * FROM your_table
WHERE id IN (5,2,6,8,12,1)
ORDER BY FIND_IN_SET(id,'5,2,6,8,12,1');
按照指定的列表逆序排序:
SELECT * FROM your_table
WHERE id IN (5,2,6,8,12,1)
ORDER BY FIND_IN_SET(id,'5,2,6,8,12,1') DESC;
【讨论】:
【参考方案5】:您的第一个查询肯定使用 order by 子句。所以,你可以只做一个连接,并使用相同的 order by 子句。
例如,如果这是您的第一个查询
选择客户 ID 来自客户 WHERE customer_id BETWEEN 1 和 100 命令 通过姓氏这是您的第二个查询
选择inventory_id 从出租 WHERE customer_id in (...有序列表...)合并为
选择 r.inventory_id 从出租r 内 加入客户c ON r.customer_id = c.customer_id C.customer_id 介于 1 和 100 之间的位置 命令 通过 c.last_name【讨论】:
以上是关于按mysql中select语句“in”子句中的值顺序排序的主要内容,如果未能解决你的问题,请参考以下文章
如何将 select 语句的 IN 子句中的参数作为具有多个值的参数传递?
如何按 Oracle SQL IN() 子句中的值顺序对结果数据进行排序