我在 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/