2016-02-01 29 views
-1

我有一個表A與列id,年齡。mysql的結果與排序是由不同的順序和限制

兩個查詢返回以下不同的結果,我不知道爲什麼:

SELECT distinct a.id id FROM A a ORDER BY a.age DESC 
SELECT distinct a.id id FROM A a ORDER BY a.age DESC LIMIT 10 OFFSET 0 

任何想法?我期望第二個查詢返回第一個查詢的前10個結果。

編輯:

什麼我忘了說是有與同年齡行。所以我認爲這與它有關。

+0

這是一個複製粘貼錯字,我的意思是OFFSET 0(反正它不正確的偏移部10以及工作) –

+0

我很懷疑。你能證明這一點嗎? – Strawberry

+0

我該如何證明它? –

回答

0

我很驚訝他們的工作。在大多數數據庫中,您會看到語法錯誤,因爲a.age不在select中。我知道MySQL擴展了GROUP BY以允許使用未聚合的列。我認爲它與SELECT DISTINCT有相同的推理。也就是說,年齡來自每個id的不確定行。這是非常不確定的,它可能會從一個查詢變成另一個查詢。

這裏有兩個合適的方法來編寫查詢:

SELECT distinct a.id, a.age 
FROM A a 
ORDER BY a.age DESC; 

或:

SELECT a.id 
FROM A a 
ORDER BY MIN(a.age) DESC; -- Or perhaps MAX(a.age) or AVG(a.age) 

這些應該有更穩定的結果,有或沒有LIMIT

+0

我們是否看到相同的問題? – Strawberry

0

找到了解決辦法。

我不知道它爲什麼會發生。我正在使用mysql,並且在添加限制時可能會執行查詢,與不使用它時不同。 任何方式,我在ORDER BY a.id中添加。這在添加限制時保持順序。

所以這是查詢的外觀:

SELECT distinct a.id id FROM A a ORDER BY a.age DESC, a.id LIMIT 10 OFFSET 0 
+0

id已編入索引,對吧?雖然在select中按列排序顯然是很好的做法,但我很驚訝這實際上對結果集有任何影響。 – Strawberry