MySQL LIMIT 返回不正确的行集

MySQL LIMIT returning incorect set of rows

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

我有一个简单的查询:

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

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

我验证了记录存在,所以我再次 运行 查询,这次使用我知道的记录,即:

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

但我又得到以下不匹配的行。

我知道我可能在做一些傻事。帮助表示赞赏。

EDIT/UPDATE: 我遵循了下面的一些建议,并通过使用特定的 WHERE 谓词而不是 LIMIT 函数来测试结果。请看下面的结果。两个查询应该 return 相同的结果——或者我期望的那样。

测试 1:

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

returns:

测试 2:

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

returns:

我希望两者相同,但事实并非如此。

解决方案: LIMIT 不关心主自增键。它关心行数(不管它们的索引)所以即使 idx 被排序 - 当某些行丢失时(意味着过去有一些删除)它会根据删除的行数抵消结果。谢谢大家。

LIMIT 的第一个参数是偏移量。它与 table.

中的任何列均无关

如果你有一个 table,你在其中插入行然后随机删除了一些行,那么 LIMIT 20, 10 不会给你 id 20 的行到 29。相反,它会在订购 table 后给你第 20 到第 29 行(删除的行在这里不起作用)

编辑:如果没有 ORDER BY 那么顺序可以是任意的。

您的 idx 栏中可能有空白。也就是说,idx的一些值曾经被使用过,但在table中已经不存在了。因此,行号与 idx 不同(LIMIT offset, row_count 适用于行号而不是 idx

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

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

SELECT idx,date_added 来自 my_table 按 idx ASC 限制排序 102366,10

偏移量是 102366 个条目,而不是从 102366 开始的 idx 偏移量。它从 104065 开始,因为您的 my_table 从 0 到 102366 有 (104065 - 102366) 1699 个间隙,这就是它从 104065 开始的原因.

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