题 按mysql中select语句“in”子句中的值顺序排序


我正在从具有整数id值的大表(数百万行)中选择一组帐户记录。从某种意义上说,作为一个人获得的查询的基础。我正在做什么构建一个大的逗号分隔列表,并将其作为“in”子句传递给查询。现在结果是完全无序的。我想要做的是按照“in”子句中的值的顺序返回结果。

我假设我将不得不构建一个临时表并进行连接,我想避免,但可能无法做到。

思考?现在查询的大小限制在每个约60k,因为我们试图限制输出大小,但它可能是任意大的,这可能排除了从实际角度来看的“in”查询,如果不是物理的。

提前致谢。


24
2018-02-02 15:09


起源


如同 stackoverflow.com/questions/1869063/customised-ordering-in-sql - Mark Byers


答案:


实际上,这更好:

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


43
2018-02-03 12:22



只是完美!! .... thanx - Kunal


有点诡计....

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,它们的结果将以REVERSE顺序返回到指定的列表。


4
2018-02-03 12:19





如果您的查询是60K,那就表明您正在以错误的方式执行此操作。

除了使用ORDER BY子句之外,没有其他方法可以对结果集进行排序。通过再次列出IN子句中的所有元素,您的订单中可能会有一个复杂的CASE子句,但您的查询可能是120K。

我知道你不想这样做,但是你应该把IN子句中的值放在表或临时表中并加入它。您还可以在临时表中包含SortOrder列,并按此顺序排序。像连接这样的数据库。这样做可以帮助您的查询表现良好。


0
2018-02-02 15:17





你是第一个查询肯定使用order by子句。因此,您可以只进行连接,并使用相同的order by子句。

例如,如果这是您的第一个查询

SELECT customer_id
  来自客户
 客户ID在1和100之间
订购
    BY last_name

这是你的第二个问题

SELECT inventory_id
  从出租
 在哪里customer_id(...有序列表......)

合并将是

SELECT r.inventory_id
  从出租r
内
  加入客户c
    ON r.customer_id = c.customer_id
 c.customer_id在1和100之间
订购
    BY c.last_name

0
2018-02-02 18:52