2017-05-08 66 views
0

這個非常簡單的查詢:爲什麼這個簡單的MySQL查詢排序「本身」

SELECT * FROM table WHERE widget_id IN (10212, 10217, 10218, 10215, 10213);

決定輸出數字順序記錄...

10212 
10213 
10215 
10217 
10218 

時候我會已經預計並要求它以我已經將它們包括在IN子句中的順序輸出記錄

這就好像我追加了ORDER BY widget_id - 當我故意沒有。

有人請說明這個SQL新手爲什麼發生這種情況,以及如何讓它按我的方式!

+1

這不是SQL的工作原理。 IN子句只是一種方便的語法,而不是一系列的OR來限制結果。其中的項目順序未被考慮在內。如果您沒有指定任何其他順序,輸出順序可能恰好是它們添加到表中的順序。 – ADyson

+1

默認順序是按照插入順序(假設沒有更新,刪除等)。如果您需要特定訂單,您絕不應該依賴此訂單。在這種情況下總是使用ORDER BY。 – mcriecken

+0

如果您的查詢中不包含「ORDER BY」子句,則結果可能會以任何順序返回。隨着行的添加和從表中刪除,排序可能會隨時間而改變。如果訂單對查詢很重要,則必須包含一個「ORDER BY」子句。 – JSR

回答

2

您正在尋找field功能:

select * 
from table 
where widget_id in (10212, 10217, 10218, 10215, 10213) 
order by field(widget_id, 10212, 10217, 10218, 10215, 10213); 

該函數返回在給定列表中,我們可以用它來排序的結果集選擇的列中的值的位置。

+0

謝謝!這是完美的。你是否同意首先命令查詢是違反直覺的?這只是「它是如何」或是?還是有一個潛在的原因?啊,現在閱讀上面的優秀評論,再次感謝! – mayersdesign

+2

@mayersdesign - where子句的目的是過濾數據 - 而不是命令它。只要結果符合應用的過濾器,服務器可以按任意順序自由地檢索結果。爲了訂購,您必須使用order by子句。 – GurV