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

时间:2010-02-02 15:09:36

标签: mysql select

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

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

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

提前致谢。

5 个答案:

答案 0 :(得分:45)

实际上,这更好:

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

答案 1 :(得分:4)

有点诡计......

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顺序返回到指定的列表。

答案 2 :(得分:1)

这是我在 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;

答案 3 :(得分:0)

如果你的查询是60K,那就表明你做错了。

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

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

答案 4 :(得分:0)

您首先查询肯定使用order by子句。因此,您可以只进行连接,并使用相同的order by子句。

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

SELECT customer_id
  FROM customer  
 WHERE customer_id BETWEEN 1 AND 100 
ORDER
    BY last_name

这是你的第二个问题

SELECT inventory_id
  FROM rental
 WHERE customer_id in (...the ordered list...)

合并将是

SELECT r.inventory_id
  FROM rental r
INNER
  JOIN customer c
    ON r.customer_id = c.customer_id    
 WHERE c.customer_id BETWEEN 1 AND 100 
ORDER
    BY c.last_name