按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”子句中的值顺序排序的主要内容,如果未能解决你的问题,请参考以下文章

MySQL“IN”子句中的逗号分隔值

按 SQL IN() 子句中的值顺序排序

如何将 select 语句的 IN 子句中的参数作为具有多个值的参数传递?

如何按 Oracle SQL IN() 子句中的值顺序对结果数据进行排序

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

在 SQL IN 子句中使用 between