我想构建一个查询,其中显示所有结果在一个表格,但是抵消5从一开始表。我可以告诉,MySQL的 LIMIT 需要一个限制以及偏移。是否有任何方式做到这一点?

有帮助吗?

解决方案

来自关于LIMIT的MySQL手册

  

从特定行检索所有行   偏移到结果的末尾   设置,你可以使用一些大数字   第二个参数。这个说法   从第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可以是您拥有的任何自动增量或唯一数字列...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top