php Mariadb:使用OFFSET和LIMIT分页跳过一行

igsr9ssn  于 2023-02-21  发布在  PHP
关注(0)|答案(1)|浏览(207)

我有一个MariaDB表:
ID、名称
id列具有以下属性:主、自动递增、唯一。
该表有40,000行。
我正在使用这个PHP & MariaDB从这个表中加载行。这是PHP代码:

$get_rows = $conn->prepare("SELECT * FROM my_table where id> 0 ORDER BY id ASC LIMIT 30 OFFSET ?");
$get_rows->bind_param('i', $offset);
//etc.

查询第一次正确返回了所有内容,但在下一次查询(通过AJAX进行)中,我收到了接下来的30行,当前结果和下一个结果之间有一行的差距。
在表中,第1行已经被删除。所以,我恢复了它,现在查询可以工作了。但是,我将来肯定要删除更多的行。(我没有软删除选项)。有没有什么方法可以继续删除行,并让这些查询返回正确的结果(不跳过任何行)?

    • 编辑**

下面是前两个查询中id范围的示例:
质询1:
247--276
疑问二:
278--307
(277缺失)
NB我问了ChatGPT,但它帮不上忙。:')

erhoui1w

erhoui1w1#

LIMIT和OFFSET通过位置而不是值来查询行。因此,如果您删除了第一个“页面”中的一行,那么所有后续行的 * 位置 * 都将向下移动一行。
确保不遗漏行的一个解决方案是,用前一页上最大的id值而不是偏移量来定义页。

$get_rows = $conn->prepare("
  SELECT * FROM my_table where id> ? 
  ORDER BY id ASC LIMIT 30");
$get_rows->bind_param('i', $lastId);

这仅在您的前一个查询查看了前一个页面时有效,因此您可以保存该页面中最后一个id的值。

相关问题