通过使用LIMIT和 OFFSET我们可以对搜索结果进行分页,某次分页时我发现某些数据会出现多次,如在limit 10 offset 0 和 limit 10 offset 10 中都存在某条记录;
LIMIT 和 OFFSET的用法
LIMIT: 则返回的行数不会超过该行数(但如果查询本身产生的行数较少,则返回的行数可能会更少,LIMIT ALL与省略LIMIT子句相同。
OFFSET: 表示在开始返回行之前跳过那么多行。 OFFSET 0与省略OFFSET子句相同。如果同时出现OFFSET和LIMIT,则在开始计算返回的LIMIT行之前,将跳过OFFSET行。
记得添加 ORDER BY
使用LIMIT时,重要的是使用ORDER BY子句将结果行约束为唯一顺序
order by 的字段必须能够确定查询行的唯一顺序,如:使用
order by age相同age存在很多记录,这并不能确定唯一顺序
否则,您将获得查询行的不可预测的子集。您可能要问的是第十到第二十行,但是第十到第二十行的顺序是什么?除非您指定ORDER BY,否则顺序是未知的。 查询优化器在生成查询计划时会考虑LIMIT,因此根据LIMIT和OFFSET的不同,您很可能会获得不同的计划(产生不同的行顺序)。因此,除非您使用ORDER BY强制执行可预测的结果排序,否则使用不同的LIMIT / OFFSET值选择查询结果的不同子集将产生不一致的结果。这不是错误;除非使用ORDER BY约束该顺序,否则SQL不会保证以任何特定顺序传递查询结果,这是一个固有的结果。
此外 OFFSET子句跳过的行仍必须在服务器内部进行计算;因此,较大的偏移可能会导致效率低下dev.to/ivoecpereir…。
有没有其他方法替代offeset分页
通过条件语句过滤结果如:把offset,替换为>辅助索引(即搜索条件)id的方式如:
SELECT * FROM table_name WHERE id > 10 LIMIT 20