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 开始的原因.
相同的逻辑可以应用于您的其他查询。
(运行 在 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 开始的原因.
相同的逻辑可以应用于您的其他查询。