php - mysql 分页 - 避免向客户端丢失或重复数据

标签 php mysql sql pagination

我在 mySql 中有一张这样的表

CREATE TABLE `usermst` (
  `userid` smallint(5) unsigned NOT NULL,
  `username` varchar(45) NOT NULL,
  `insdate` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

有如下数据

insert into usermst(userid, username)
values (1, "user 1"),
       (2, "user 2"),
       (3, "user 3"),
       (4, "user 4"),
       (5, "user 5"),
       (6, "user 6"),
       (7, "user 7"),
       (8, "user 8"),
       (9, "user 9"),
       (10, "user 10");

如果我查询第一页有 4 条记录(分页),它的工作正常。

select * from usermst order by insdate desc, userid desc limit 0,4;

输出:

userid  username insdate
10      user 10  2016-03-08 12:32:04.239335
9       user 9   2016-03-08 12:32:04.239335
8       user 8   2016-03-08 12:32:04.239335
7       user 7   2016-03-08 12:32:04.239335

使用以下查询请求第二页

select * from usermst order by insdate desc, userid desc limit 4,4;

输出:

userid  username insdate
6       user 6   2016-03-08 12:32:04.239335
5       user 5   2016-03-08 12:32:04.239335
4       user 4   2016-03-08 12:32:04.239335
3       user 3   2016-03-08 12:32:04.239335

但是,如果以某种方式删除了 page1 的记录,则客户端将丢失数据。或在 page1 中插入的记录(根据我的查询排序),将在客户端获取重复数据。 如何防止这个错误?

最佳答案

我将使用的方法是将您的分页基于排序列值 - 但仅在遍历页面时(下一页/上一页按钮)。当希望导航到特定页码时,仍然必须使用您现有的方法,但我认为您描述的问题只是在使用 Next/Prev 按钮导航时确实是一个问题。

对于每个“下一个”页面,获取“insdate”小于上一个页面获取的最后一个“insdate”的所有行。

对于第一页:

SELECT * FROM usermst ORDER BY insdate DESC, userid DESC LIMIT 0,4;
SELECT @prevInsDate := insdate, @prevUserId := userid FROM usermst 
    ORDER BY insdate DESC, userid DESC LIMIT 3,1;

对于下(第二)页:

SELECT * FROM usermst 
WHERE insdate <= @prevInsDate AND userid < @prevUserId
ORDER BY insdate DESC, userid DESC LIMIT 0,4;

SELECT @prevInsDate := insdate, @prevUserId := userid FROM usermst 
    ORDER BY insdate DESC, userid DESC LIMIT 7,1;

其中@prevInsDate 和@prevUserId 已声明为变量。

关于php - mysql 分页 - 避免向客户端丢失或重复数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35867739/

相关文章:

javascript - 需要帮助获得自动建议以显示(以列表形式)从数据库中获取/匹配的数据

mysql - SQL JOIN 平均值

php - 如何使用 php 从 mysql 查询中提取表名?

MySQL使用varchar列进行分表查询

php - 关于变量的死简单的 PHP 问题

php - 使用基于 Composer 的库而不使用 Composer 包裹在同名类中?

php - Crontab:PHP Wget 或 Curl

php - 在 URL 查询中传递 PHP 变量

sql - 如何计算最后一个值与X前的值之间的百分比?

sql - 如何从 SQL Azure 中具有外键约束的表中清除数据