(在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函数来测试结果。请参阅下面的结果。两个查询都应返回相同的结果 - 或者我希望如此。
TEST 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被SORTed - 当某些行丢失时(意味着过去有一些删除),它将根据删除的行数偏移结果。 Thx All。
答案 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开始的原因。
可以将相同的逻辑应用于您的其他查询。