我有一個包含多個具有相同數據的行的表。我用SELECT DISTINCT
得到一個獨特的行,它工作正常。但是,當我使用ORDER BY
與SELECT DISTINCT
它給我未排序的數據。SELECT DISTINCT在MySQL中如何工作?
誰能告訴我有多獨特的作品?
根據什麼標準選擇行?
我有一個包含多個具有相同數據的行的表。我用SELECT DISTINCT
得到一個獨特的行,它工作正常。但是,當我使用ORDER BY
與SELECT DISTINCT
它給我未排序的數據。SELECT DISTINCT在MySQL中如何工作?
誰能告訴我有多獨特的作品?
根據什麼標準選擇行?
當您指定SELECT DISTINCT
時,它會爲您提供所有行,消除結果集中的重複項。 「重複」是指所有字段具有相同值的行。例如,假設你有一個表,看起來像:
id | num
--------------
1 | 1
2 | 3
3 | 3
SELECT DISTINCT *
將返回所有行以上,而SELECT DISTINCT num
將返回兩行:
num
-----
1
3
需要注意的是哪一行的實際行(例如:是否它是第2行或第3行)它是不相關的,因爲結果是無法區分的。
最後,DISTINCT
應該不是影響如何ORDER BY
工作。
它看起來像在MYSQL中。閱讀它:http://dev.mysql.com/doc/refman/5.0/en/distinct-optimization.html – Icarus
它幾乎就像一個bug :) – Randy
@Icarus它執行的優化是無關緊要的,只要結果集以您期望的方式迴歸。 – NullUserException
從您的評論前,您要運行查詢
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
這就是爲什麼你的結果是沒有排序。
您所描述的行爲發生在你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
子句中的表達式的值進行操作。如果第一行被處理,則(A
,B
)被放置在結果集中,並且它與行#1相關聯。然後,當處理第2行時,SELECT
表達式的值會生成已存在於結果集中的記錄(A
,B
)。由於DISTINCT
它被丟棄。第3行生成(X
,Y
),也放在結果集中。然後,ORDER BY column3
子句使記錄在結果集中排序爲(A
,B
),(X
,Y
)。
但是,如果行#2之前的行#1中處理然後,按照前面段落中暴露相同的邏輯,在結果集中的記錄被分類爲(X
,Y
),(A
,B
)。
當數據庫引擎運行查詢時,它沒有對數據庫引擎強加處理行的規則。數據庫可以自由處理任何順序的行,它認爲它對性能更好。
您的查詢是無效的SQL,並且它可以使用相同的輸入數據返回不同的結果的事實證明了它。
您試圖運行什麼查詢? – srivani
@srivani:從表中選擇不同的id,其中id2 = 12312按時間順序排序。 – insomiac
我知道這太遲了,但目前還沒有接受的答案,所以我想知道OP是否仍然想要回答某些未在給定答案中涵蓋的內容? –