2017-02-09 23 views
0

的(運行在MySQL的MS Azure雲版本 - CleadDB)MySQL的LIMIT歸國incorect設置行

我有一個簡單的查詢:

SELECT idx, date_added FROM my_table ORDER BY idx ASC LIMIT 100752, 10 

我期待着得到旁邊的IDX後10條記錄100752(如果有的話)。但是我得到完全不同的結果,即:

enter image description here

我驗證記錄存在,所以我再次運行查詢,這一次,我知道了記錄有即:

SELECT idx, date_added FROM my_table ORDER BY idx ASC LIMIT 102366, 10 

但我再次獲得以下不匹配的行。

enter image description here

我知道我可能做一些愚蠢的。幫助讚賞。

編輯/更新: 我遵循下面的一些建議,並通過使用特定的WHERE謂詞而不是LIMIT函數來測試結果。請看下面的結果。兩個查詢都應該返回相同的結果 - 或者我期望的結果。

TEST 1:

SELECT idx, date_added FROM attachments ORDER BY idx ASC LIMIT 67805, 20 

回報: enter image description here

TEST 2:

SELECT 
    idx, date_added 
FROM attachments 
WHERE 
    idx >=67805 and idx <67825 
ORDER BY idx ASC 

回報: enter image description here

我希望兩者都是相同的,但事實並非如此。

SOLUTION: LIMIT不關心主自動遞增鍵。它關心行數(不管它們的索引如何),所以即使idx是SORTed - 當某些行缺失(意味着過去有一些刪除),它將根據刪除的行數來抵消結果。 Thx全部。

+0

運行:'SELECT MAX(IDX),從attachments' COUNT(*),看看結果 – RIKI

+0

@OTARIKI是THX,並且不返回任何內容! WTH? – Milan

+0

@GurV你是認真的嗎? – Milan

回答

1

LIMIT的第一個參數被抵消。它與表中的任何列無關。

如果你有一個表,在那裏你插入的行,然後在兩者之間則LIMIT 20, 10不會給你行隨機刪除了一些行與ID 20至29相反,它會在訂購表後給你20日至29排(刪除的行在這裏不起作用)

編輯:如果沒有ORDER BY那麼順序可以是任意的。 https://stackoverflow.com/a/20050403/1435132

+0

已刪除的行發揮作用 - if你已經刪除了一些行並添加了新的行MySQL將重用這個可用空間。所以如果你選擇沒有命令它可能這個新記錄不是在結果的末尾 –

+0

是的,如果沒有'ORDER BY'那麼命令可以是任意的。 http://stackoverflow.com/a/20050403/1435132 – Sangharsh

+0

..反正,但我不明白這是如何回答我的問題。 a)我的查詢有ORDER BY和b)你可以清楚地看到前面的equerry中存在的行,所以你的理論在這裏不適用。 – Milan

1

您的idx列可能有空白。也就是說,idx的一些值曾經被使用過但在表中不再存在。因此,行號與idxLIMIT offset, row_count不適用於行號不相同)的行號不相同。

爲什麼不試試這個查詢呢?

SELECT 
    idx, date_added 
FROM my_table 
WHERE 
    idx >=100752 and idx <100762 
ORDER BY idx ASC 
+1

是的,謝謝你的替代查詢解決方案。如何得到結果肯定有不止一種方法。但是,我有興趣知道wth是否正在使用LIMIT功能。請看我對OTARIKI的評論,這可能有助於澄清問題。 – Milan