2011-09-16 43 views
5

我有一個包含多個具有相同數據的行的表。我用SELECT DISTINCT得到一個獨特的行,它工作正常。但是,當我使用ORDER BYSELECT DISTINCT它給我未排序的數據。SELECT DISTINCT在MySQL中如何工作?

誰能告訴我有多獨特的作品?

根據什麼標準選擇行?

+0

您試圖運行什麼查詢? – srivani

+0

@srivani:從表中選擇不同的id,其中id2 = 12312按時間順序排序。 – insomiac

+0

我知道這太遲了,但目前還沒有接受的答案,所以我想知道OP是否仍然想要回答某些未在給定答案中涵蓋的內容? –

回答

1

當您指定SELECT DISTINCT時,它會爲您提供所有行,消除結果集中的重複項。 「重複」是指所有字段具有相同值的行。例如,假設你有一個表,看起來像:

id | num 
-------------- 
1 | 1 
2 | 3 
3 | 3 

SELECT DISTINCT *將返回所有行以上,而SELECT DISTINCT num將返回兩行:

num 
----- 
1 
3 

需要注意的是哪一行的實際行(例如:是否它是第2行或第3行)它是不相關的,因爲結果是無法區分的。

最後,DISTINCT應該不是影響如何ORDER BY工作。

參考:MySQL SELECT statement

+2

它看起來像在MYSQL中。閱讀它:http://dev.mysql.com/doc/refman/5.0/en/distinct-optimization.html – Icarus

+0

它幾乎就像一個bug :) – Randy

+0

@Icarus它執行的優化是無關緊要的,只要結果集以您期望的方式迴歸。 – NullUserException

2

從您的評論前,您要運行查詢

Select distinct id from table where id2 =12312 order by time desc. 

如我所料,這裏是你的問題。您的選擇列和按列排序是不同的。您的輸出行按時間排序,但該順序不一定需要保存在id列中。這是一個例子。

id | id2 | time 
------------------- 
1 | 12312 | 34 
2 | 12312 | 12 
3 | 12312 | 48 

如果運行

SELECT * FROM table WHERE id2=12312 ORDER BY time DESC 

,你會得到以下結果

id | id2 | time 
------------------- 
2 | 12312 | 12 
1 | 12312 | 34 
3 | 12312 | 48 

現在,如果你只選擇這個id列,你會得到

id 
-- 
2 
1 
3 

這就是爲什麼你的結果是沒有排序。

+0

如果你有多個id(例如:id = 2和id = 1多次發生),它將通過按時間去做desc選擇哪一個? – insomiac

+0

如果您運行「從表中選擇不同的ID,其中id2 = 12312 order by time desc」,重複項將被刪除。如果您運行「從表中選擇id,其中id2 = 12312 order by time desc」,結果將包含重複項。所以所有的id都會被返回。 – srivani

+0

感謝您的回覆,例如,如果我想獲得最近的ids按時間,如果我正在用不同的id時間desc。它不適用於MySQL。你知道如何區別於秩序嗎? – insomiac

0

您所描述的行爲發生在你ORDER BY是不存在的SELECT子句中的表達式。 SQL標準不允許這樣的查詢,但MySQL不太嚴格並且允許。

讓我們嘗試一個例子:

SELECT DISTINCT colum1, column2 
FROM table1 
WHERE ... 
ORDER BY column3 

假設表table1的內容是:

id | column1 | column2 | column3 
----+---------+---------+--------- 
    1 | A  | B  | 1 
    2 | A  | B  | 5 
    3 | X  | Y  | 3 

沒有ORDER BY條款,以下兩個記錄(不ORDER BY的順序執行上述查詢返回不保證):

column1 | column2 
---------+--------- 
A  | B 
X  | Y 

但與ORDER BY column3訂單也不能保證。

DISTINCT子句對存在於SELECT子句中的表達式的值進行操作。如果第一行被處理,則(AB)被放置在結果集中,並且它與行#1相關聯。然後,當處理第2行時,SELECT表達式的值會生成已存在於結果集中的記錄(AB)。由於DISTINCT它被丟棄。第3行生成(X,Y),也放在結果集中。然後,ORDER BY column3子句使記錄在結果集中排序爲(AB),(X,Y)。

但是,如果行#2之前的行#1中處理然後,按照前面段落中暴露相同的邏輯,在結果集中的記錄被分類爲(XY),(AB)。

當數據庫引擎運行查詢時,它沒有對數據庫引擎強加處理行的規則。數據庫可以自由處理任何順序的行,它認爲它對性能更好。

您的查詢是無效的SQL,並且它可以使用相同的輸入數據返回不同的結果的事實證明了它。