【问题标题】:MySQL LIMIT returning incorect set of rowsMySQL LIMIT 返回不正确的行集
【发布时间】: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%,两列都是空的

标签: mysql cleardb


【解决方案1】:

LIMIT 的第一个参数是偏移量。它与表中的任何列都不相关。

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

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

【讨论】:

  • 删除的行会起作用——如果您删除了一些行并追加新行,MySQL 将重用可用空间。因此,如果您选择不按顺序选择,则此新记录可能不在结果的末尾
  • 是的,如果没有ORDER BY,那么顺序可以是任意的。 stackoverflow.com/a/20050403/1435132
  • ..对不起,但我不明白这是如何回答我的问题。 a)我的查询有 ORDER BY 和 b)你可以清楚地看到前一个查询中存在的行,所以你的理论在这里不成立。
  • 你能分享这个输出吗? SELECT COUNT(DISTINCT idx) FROM my_table WHERE id &lt; 102366
  • 我完全明白了!你是对的兄弟。我没有计算超过 100,000 的 idx 并且有一些删除。这是有道理的。 LIMIT(即使 SORTet by idx)不关心 idx 本身,它关心行数!因此,当我到达表中某些行已被删除的位置时,会出现不一致。干得好!
【解决方案2】:

您的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 

【讨论】:

  • 是的,感谢您提供备用查询解决方案。获得结果的方法肯定不止一种。但是,我很想知道 LIMIT 功能正在发生什么。请查看我对 OTARIKI 的 cmets,这可能有助于澄清问题。
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    • 2021-12-06
    • 2019-12-21
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多