我想构造一个查询,在表中显示所有结果,但是从表的开头偏移5。据我所知,MySQL LIMIT
需要一个限制和一个偏移量。有什么办法吗?
limit 5000, 18446744073709551615
。您不会仅仅为了让代码看起来漂亮就获取额外的5000行。
我想构造一个查询,在表中显示所有结果,但是从表的开头偏移5。据我所知,MySQL LIMIT
需要一个限制和一个偏移量。有什么办法吗?
limit 5000, 18446744073709551615
。您不会仅仅为了让代码看起来漂亮就获取额外的5000行。
Answers:
要检索从某个偏移量到结果集结尾的所有行,可以为第二个参数使用较大的数字。该语句检索从第96行到最后一行的所有行:
SELECT * FROM tbl LIMIT 95, 18446744073709551615;
Limit -1
或者Limit Null
看起来很合理!或atleast Limit应该接受子查询,例如select * from table limit (select count(*) from table)
如其他答案所述,MySQL建议使用18446744073709551615作为限制中的记录数,但请考虑以下几点:如果您获得了18,446,744,073,709,551,615条记录,该怎么办?实际上,如果您有1,000,000,000条记录,该怎么办?
也许您确实想要超过10亿条记录,但是我的意思是,您想要的数目有一定的限制,并且少于18百万个。为了稳定,优化和可能的可用性,我建议对查询设置一些有意义的限制。对于那些从未见过如此神奇的数字的人,这也将减少混乱,并具有至少一次传达您愿意处理多少条记录的额外好处。
如果您真的必须从数据库中获取所有18亿个记录,那么您真正想要的就是以1亿为增量获取它们并循环1840亿次。
另一种方法是选择一个自动增加的列,然后使用HAVING对其进行过滤。
SET @a := 0;
select @a:=@a + 1 AS counter, table.* FROM table
HAVING counter > 4
但是我可能会坚持使用上限方法。
$sql = 'SET @a :=0 SELECT .....';
正如其他人提到的,来自MySQL手册。为了实现这一点,可以使用无符号big int的最大值,即这个可怕的数字(18446744073709551615)。但是为了使它少一点混乱,您可以使用代字号“〜”按位运算符。
LIMIT 95, ~0
它是按位取反的。结果“〜0”为18446744073709551615。
LIMIT 5, ~0
和LIMIT ~0 OFFSET 5
。这是MySQL 8.0功能吗?
就在今天,我正在阅读从mysql表中获取大量数据(超过一百万行)的最佳方法。一种方法是,按照建议,使用LIMIT x,y
其中x
的偏移和y
你想要的最后一行返回。但是,正如我发现的那样,这并不是最有效的方法。如果您有自动递增的列,则可以轻松地使用SELECT
带有WHERE
子句的语句,该语句说明您要从哪个记录开始。
例如,
SELECT * FROM table_name WHERE id > x;
似乎mysql在使用时会得到所有结果LIMIT
,然后只显示适合偏移量的记录:不是最佳性能。
资料来源:这个问题的答案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;
当然,如有必要,您可以从count_result中减去期望的偏移量,以获得实际的准确值作为限制。如果我实际上可以确定要提供的适当限制,则传递“ 18446744073709551610”值就没有任何意义。