题
我想构建一个查询,其中显示所有结果在一个表格,但是抵消5从一开始表。我可以告诉,MySQL的 LIMIT
需要一个限制以及偏移。是否有任何方式做到这一点?
解决方案
从特定行检索所有行 偏移到结果的末尾 设置,你可以使用一些大数字 第二个参数。这个说法 从第96行检索所有行 到最后:
SELECT * FROM tbl LIMIT 95, 18446744073709551615;
其他提示
正如您所提到的,LIMIT是必需的,因此您需要使用可能的最大限制,即18446744073709551615(最大未签名BIGINT)
SELECT * FROM somewhere LIMIT 18446744073709551610 OFFSET 5
正如其他答案中所述,MySQL建议使用18446744073709551615作为限制中的记录数量,但请考虑一下:如果您获得18,446,744,073,709,551,615条记录,您会怎么做?事实上,如果你有1,000,000,000条记录,你会怎么做?
也许你确实想要超过十亿条记录,但我的观点是你想要的数字有一些限制,并且它不到18个。为了稳定性,优化和可能的可用性,我建议对查询设置一些有意义的限制。这也可以减少任何从未见过这个神奇数字的人的混淆,并且还可以至少传达你愿意同时处理多少条记录的额外好处。
如果你真的必须从你的数据库中获取所有18个quintillion记录,也许你真正想要的是以1亿的增量获取它们并循环1840亿次。
另一种方法是选择自动增量列,然后使用HAVING过滤它。
SET @a := 0;
select @a:=@a + 1 AS counter, table.* FROM table
HAVING counter > 4
但我可能会坚持使用上限方法。
就在今天,我正在阅读从mysql表中获取大量数据(超过一百万行)的最佳方法。一种方法是,如建议的那样,使用 LIMIT x,y
,其中 x
是偏移量, y
是你想要返回的最后一行。但是,正如我发现的那样,这不是最有效的方法。如果你有一个自动增量列,你可以轻松地使用 SELECT
语句和 WHERE
子句来说明你想从哪条记录开始。
例如,
SELECT * FROM table_name WHERE id> X; 代码>
当您使用 LIMIT
时,似乎mysql会获得所有结果,然后只显示适合偏移量的记录:不是最佳性能。
来源:回答这个问题 MySQL论坛。请注意,问题大概是6岁。
您可以使用带有LIMIT的MySQL语句:
START TRANSACTION;
SET @my_offset = 5;
SET @rows = (SELECT COUNT(*) FROM my_table);
PREPARE statement FROM 'SELECT * FROM my_table LIMIT ? OFFSET ?';
EXECUTE statement USING @rows, @my_offset;
COMMIT;
在MySQL 5.5.44中测试过。因此,我们可以避免插入号码18446744073709551615。
注意:事务确保变量@rows与执行语句时考虑的表一致。
我知道这是旧的,但我没有看到一个类似的反应所以这是解决我会使用。
首先,我将执行一个计查询的桌上看到许多记录的存在。这个查询是快速和正常的执行时间是可以忽略不计。是这样的:
SELECT COUNT(*) FROM table_name;
然后,我会建立我的查询使用的结果,我从计数作为我的限制(因为这是最大数目的行表可能返回)。是这样的:
SELECT * FROM table_name LIMIT count_result OFFSET desired_offset;
或者可能是这样的:
SELECT * FROM table_name LIMIT desired_offset, count_result;
当然,如有必要,可以减desired_offset从count_result获得实际的、准确的价值来源为限度。通过"18446744073709551610"的价值,只是没意义如果我可以确定一个适当的限制来提供。
WHERE .... AND id > <YOUROFFSET>
id可以是您拥有的任何自动增量或唯一数字列...