2011-05-23 76 views
2

假設類似的數據:MySQL查詢與秩序和限制

table: shapes 

id type 
---------------- 
1  Square 
2  Rectangle 
3  Square 
4  Square 

當我執行以下查詢:

SELECT `shapes`.* FROM `shapes` WHERE `shapes`.`type` = 'Square' ORDER BY shapes.id DESC LIMIT 1 

我希望接收與ID行:4。沒想到,我M個接收一排ID:1

對於真是個奇怪的一部分:如果我和LIMIT 2執行相同的查詢:

SELECT `shapes`.* FROM `shapes` WHERE `shapes`.`type` = 'Square' ORDER BY shapes.id DESC LIMIT 2 

該組2中的第一行實際上是正確的行!

爲了增加奇怪性,我在同一個MySQL服務器中有另一個這個數據庫的副本,它返回任何限制查詢的正確行,LIMIT 1或其他。

我可以得到的唯一答案是轉儲並重新加載數據庫,但我想了解爲什麼在採取該操作之前發生這種情況,如果可能的話。

tl; dr:LIMIT 1返回錯誤的行。 LIMIT 2返回正確的行(第一個)。似乎是數據庫特定的。

+0

經過進一步的審查,一位同事幫助發現了另一個奇怪之處。如果我在查詢中設置了「限制2」而不是「限制1」,則返回正確的最終結果。更不正當的是,當我在同一個MySQL實例中的不同數據庫中的類似數據集上運行相同的查詢時,查詢將返回正確的數據。我現在認爲這個問題是孤立於單個MySQL數據庫的,但是對於什麼會導致這種行爲感到困惑。 – 2011-05-23 15:02:09

+0

(我編輯了這個問題以反映上面的發現,並刪除了與問題無關的Rails干擾項) – 2011-05-23 15:28:29

+0

試圖修復/分析表? – 2011-05-24 06:16:24

回答

0

由於您未使用限制0,1而導致問題。雖然未提供完整查詢,但有時會顯示錯誤結果。我建議你輸入/執行完整的查詢。

+0

爲了好玩,我嘗試了你的建議,但沒有改變。從文檔:「LIMIT需要一個或兩個數字參數...」,或者更確切地說,從語法指南:「LIMIT {[offset,] row_count | row_count OFFSET offset}' – 2011-05-25 11:56:07

+0

然後您必須檢查是否有任何觸發器或過程與表關聯。它通常發生在那些情況下 – Vineet1982 2011-05-25 14:28:23