我想构建一个查询,将所有结果显示在表中,但从表的开头偏移5行。据我所知,MySQL的LIMIT
需要限制和偏移量。是否有任何方法可以实现此目的?
根据MySQL手册中的LIMIT部分:
如果要检索从某个偏移量到结果集末尾的所有行,可以为第二个参数使用一些大数。以下语句将返回从第96行到最后一行的所有行:
SELECT * FROM tbl LIMIT 95, 18446744073709551615;
Limit-1
或者Limit Null
看起来相当合理!或者至少,Limit
应该接受一个子查询,像这样:select * from table limit (select count(*) from table)
。 - vulcan raven根据您提到的需要使用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万亿条记录,也许你真正想要的是以每1亿条记录为增量进行抓取并循环1840亿次。
select * from table
。那么问题来了,如果你为该查询获得了18万亿条记录,你会怎么做呢?难道我们要修改所有基本查询,像这样加上一个限制 select * from table limit 0, 1000000
,以避免获取太多的记录吗?我只是认为这是MySQL设计上的缺陷,特别是其他数据库系统如PostgreSQL可以有像这样的查询 select * from myTable offset 10
,我经常使用。 - Ray PereaSET @a := 0;
select @a:=@a + 1 AS counter, table.* FROM table
HAVING counter > 4
$sql = 'SET @a :=0 SELECT .....';
- Reham Fahmy正如其他人提到的,可以从MySQL手册中了解到。为了实现这个目标,你可以使用一个无符号大整数的最大值,即这个可怕的数字(18446744073709551615)。但是要使它变得更加简洁,你可以使用波浪线“~”按位运算符。
LIMIT 95, ~0
它作为位非运算符。"~0"的结果是18446744073709551615。
LIMIT 5, ~0
和LIMIT ~0 OFFSET 5
两种方式。这是MySQL 8.0的一个特性吗? - jurchiks你可以使用带有 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与执行语句时考虑的表一致。
在练习LC#1321时,我遇到了一个非常相似的问题,即我必须选择所有日期,但前6个日期被跳过。
我在MySQL中使用ROW_NUMBER()
窗口函数和子查询来实现这一点。例如,以下查询返回跳过前五行的所有结果:
SELECT
fieldname1,
fieldname2
FROM(
SELECT
*,
ROW_NUMBER() OVER() row_num
FROM
mytable
) tmp
WHERE
row_num > 5;
你可能需要在子查询中添加一些逻辑,特别是在 OVER()
中以适应你的需求。此外,根据你的实际偏移逻辑,可以使用 RANK()
/DENSE_RANK()
窗口函数代替 ROW_NUMBER()
。
参考资料:
LIMIT x,y
,其中x
是偏移量,y
是您想要返回的最后一行。然而,正如我发现的那样,这不是最有效的方法。如果您有一个自增列,您可以轻松地使用带有WHERE
子句的SELECT
语句来指定您想要开始的记录。SELECT * FROM table_name WHERE id > x;
似乎当您使用LIMIT
时,mysql会获取所有结果,然后仅显示符合偏移量的记录:性能并不是最好的。我知道这个问题有点老了,但是我没有看到类似的回答,所以这是我会使用的解决方案。
首先,我会在表上执行一个计数查询,以查看有多少条记录存在。这个查询很快,通常执行时间可以忽略不计。例如:
SELECT COUNT(*) FROM table_name;
接下来,我将使用从计数中获取的结果作为我的限制来构建查询(因为这是表可能返回的最大行数)。就像这样:
SELECT * FROM table_name LIMIT count_result OFFSET desired_offset;
或者可能是这样的:
SELECT * FROM table_name LIMIT desired_offset, count_result;
WHERE .... AND id > <YOUROFFSET>
id 可以是任何自增或唯一数字列...
limit 5000, 18446744073709551615
,那么你不需要为了让代码看起来漂亮而多获取5000行。 - elipoultorak