MySQL LIMIT返回incorect行集

时间:2017-02-09 17:37:08

标签: mysql cleardb

(在MS Azure云版MySQL上运行 - CleadDB)

我有一个简单的查询:

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

我希望在idx 100752(如果有的话)之后获得接下来的10条记录。但是我得到完全不同的记录,即:

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

测试2:

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

返回: enter image description here

我希望两者都是一样的但事实并非如此。

解: LIMIT不关心主要自动增量键。它关心行数(无论它们的索引如何),所以即使idx被SORTed - 当某些行丢失时(意味着过去有一些删除),它将根据删除的行数偏移结果。 Thx All。

3 个答案:

答案 0 :(得分:1)

LIMIT的第一个参数是偏移的。它与表中的任何列无关。

如果您有一个表格,在那里插入行,然后在两者之间随机删除一些行,LIMIT 20, 10将不会为您提供 id 20到29的行。相反它会给你20分在订购您的餐桌后排到第29行(删除的行不会在这里发挥作用)

编辑:如果没有ORDER BY,那么订单可以是任意的。 https://stackoverflow.com/a/20050403/1435132

答案 1 :(得分:1)

您的idx列中可能存在空白。也就是说,idx的某些值曾被使用但在表中不再存在。因此,行号与idx不同(LIMIT offset, row_count适用于行号而不是idx

为什么不试试这个查询呢?

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

答案 2 :(得分:0)

选择idx,从my_table中添加date_ BY IDx ASC LIMIT 102366,10

偏移量是102366条目,而不是从102366开始的idx偏移量。它从104065开始,因为my_table中从0到102366的间隔为(104065-102366)1699,这就是为什么它从104065开始的原因。

可以将相同的逻辑应用于您的其他查询。