MySQL偏移无限行

sti*_*eta 105 mysql sql sql-limit

我想构建一个查询,在表中显示所有结果,但从表的开头偏移5.据我所知,MySQL LIMIT需要一个限制和一个偏移量.有没有办法做到这一点?

Gre*_*reg 144

来自LIMIT上MySQL手册:

要从特定偏移量检索所有行直到结果集的末尾,可以使用一些大数字作为第二个参数.此语句检索从第96行到最后一行的所有行:

SELECT * FROM tbl LIMIT 95, 18446744073709551615;
Run Code Online (Sandbox Code Playgroud)

  • 可怕!我来到这里希望MySQL使Limit子句可选,因为它是,但也提供了偏移...但不!我已经看到这个18446744073709551615散布在整个代码中,我责怪懒惰的程序员,但它是一个设计功能! (98认同)
  • 对于那些想知道的人来说,18446744073709551615是2 ^ 64-1.您可能需要注意,因为您将无法将此值存储在32位整数中.您必须确保将其存储为字符串以确保兼容性. (20认同)
  • 使用php'PHP_INT_MAX'来避免溢出效应. (19认同)
  • 可怕!他们需要比这更优雅......"限制-1"或"限制空"看起来非常合理!或者至少限制应该接受一个子查询,例如`select*from table limit(select table(*)from table)` (12认同)
  • 糟糕的答案,但那是MySQL Doc的官方.我能说什么@ _ @ (8认同)
  • 那很难看. (3认同)

Czi*_*imi 23

正如您所提到的,LIMIT是必需的,因此您需要使用最大限制,即18446744073709551615(最大未签名BIGINT)

SELECT * FROM somewhere LIMIT 18446744073709551610 OFFSET 5
Run Code Online (Sandbox Code Playgroud)

  • 哇,这是MySQL团队的官方解决方案吗? (30认同)

ces*_*oid 8

正如其他答案中所述,MySQL建议使用18446744073709551615作为限制中的记录数,但请考虑一下:如果您获得18,446,744,073,709,551,615条记录,您会怎么做?事实上,如果你有1,000,000,000条记录,你会怎么做?

也许你确实需要超过10亿条记录,但我的观点是你想要的数字有一些限制,而且它不到18个数量级.为了稳定性,优化和可能的可用性,我建议对查询设置一些有意义的限制.这也可以减少任何从未见过这个神奇数字的人的混淆,并且还可以至少传达您愿意同时处理多少条记录的额外好处.

如果你真的必须从你的数据库中获得所有18个quintillion记录,也许你真正想要的是以1亿的增量获取它们并循环1840亿次.


jis*_*shi 5

另一种方法是选择自动增量色谱柱,然后使用HAVING过滤它.

SET @a := 0; 
select @a:=@a + 1 AS counter, table.* FROM table 
HAVING counter > 4
Run Code Online (Sandbox Code Playgroud)

但我可能会坚持使用上限方法.