我正在从具有整数id值的大表(数百万行)中选择一组帐户记录。从某种意义上说,作为一个人获得的查询的基础。我正在做什么构建一个大的逗号分隔列表,并将其作为“in”子句传递给查询。现在结果是完全无序的。我想做的是按照“in”子句中的值的顺序返回结果。
我假设我将不得不构建一个临时表并进行连接,我想避免,但可能无法实现。
思考?现在查询的大小限制在每个约60k,因为我们试图限制输出大小,但它可能是任意大的,这可能排除了从实际角度来看的“in”查询,如果不是物理的。
提前致谢。
答案 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