2009-09-03 44 views

回答

20

你可以使用FIND_IN_SET做到這一點,例如

SELECT * FROM T WHERE T.id IN(4,78,12,45) 
ORDER BY FIND_IN_SET(T.id,'4,78,12,45'); 

雖然您必須複製列表,但如果您在代碼中生成查詢,這不是一個大問題。

+0

+1教我關於我不瞭解MySQL的一些信息! – Welbog 2009-09-03 11:36:29

+0

+1非常乾淨!我喜歡它,希望SQL服務器有它。 – 2009-09-03 11:37:57

+0

對於這樣的小案例,這應該是非常有效的,但是如果您的選擇列表很大,我會想象臨時表方法將會更加高效。 – 2009-09-03 12:38:21

1

在一般情況下,你不能。除非使用ORDER BY子句,否則SQL不保證順序,並且它不能與IN語句的內容捆綁在一起。

但是,如果您可以構建一個臨時表來對您選擇的值進行排序,則可以加入該表並按順序排序。

例如,您有一個包含類似於下面的一個臨時表:

id | order 
----+------ 
4 | 1 
78 | 2 
12 | 3 
45 | 4 

然後你可以訂購它是這樣的:

SELECT T.* 
FROM T 
INNER JOIN temp 
ON T.id = temp.id 
ORDER BY temp.order ASC 
+0

雖然我喜歡Paul Dixon提供的解決方案的清潔度。這可能更容易理解,甚至可能更快。 – 2009-09-03 11:40:31

0

您不能通過IN子句進行排序。您必須提供一個單獨的ORDER BY子句。通過在ORDER BY中構建一個case語句來實現這一點的方法如下。雖然這並不漂亮。

SELECT 
    * 
FROM 
    T 
WHERE 
    T.Id IN(4, 78, 12, 45) 
ORDER BY 
    CASE 
     WHEN T.Id = 4 THEN 1 
     WHEN T.Id = 78 THEN 2 
     WHEN T.Id = 12 THEN 3 
     WHEN T.Id = 45 THEN 4 
    END