【发布时间】:2017-06-27 20:29:00
【问题描述】:
(在 MS Azure 云版本的 MySQL - CleadDB 上运行)
我有一个简单的查询:
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
但我再次得到以下不匹配的行。
我知道我可能在做一些愚蠢的事情。帮助表示赞赏。
编辑/更新: 我遵循了下面的一些建议,并使用特定的 WHERE 谓词而不是 LIMIT 函数来测试结果。请看下面的结果。两个查询都应该返回相同的结果 - 或者我希望如此。
测试 1:
SELECT idx, date_added FROM attachments ORDER BY idx ASC LIMIT 67805, 20
测试 2:
SELECT
idx, date_added
FROM attachments
WHERE
idx >=67805 and idx <67825
ORDER BY idx ASC
我希望两者都相同,但事实并非如此。
解决方案: LIMIT 不关心主自增键。它关心行数(无论它们的索引如何),因此即使对 idx 进行了排序——当某些行丢失时(意味着过去有一些删除),它也会根据删除的行数来抵消结果。谢谢大家。
【问题讨论】:
-
运行:
SELECT max(idx), count(*) from attachments并查看结果 -
@OTARIKI 是的,谢谢,这没有任何回报! WTH ?
-
@GurV 你是认真的吗?
-
你确定“什么都不返回”吗?
-
100%,两列都是空的