2010-02-02 107 views
23

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

我假设我将不得不构建一个临时表并执行一个连接,而不是我想要避免但可能无法连接的连接。

想法?目前查询的大小最多为60k左右,因为我们试图限制输出大小,但它可能是任意大的,从实际的角度来看,这可能会排除“in”查询,如果不是物理的。

在此先感谢。

+0

类似http://stackoverflow.com/questions/1869063/customised-ordering-in- sql – 2010-02-02 15:14:17

回答

0

如果您的查询是60K,那么表示您以错误的方式执行此操作。

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

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

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