【发布时间】:2014-08-09 14:18:31
【问题描述】:
我正在构建我的应用程序的后台,我想按 id 降序排列最后 20 个用户。
我在我的页面中实现了无限滚动,所以每次管理员点击页面底部时,都会通过 Ajax 发送一个新请求以检索以下 20 个用户等……直到我们获得第一个用户.
总结一下,这里有几个查询:
select * from users order by id desc limit 0, 20
select * from users order by id desc limit 20, 20
select * from users order by id desc limit 40, 20
...
但问题是我按降序排列用户。所以如果一个新用户在我滚动时注册,我每次发送请求都会得到重复的结果。
假设我的用户列表如下,我的限制是 3(而不是 20)
1. Pierre
2. Paul
3. Jack
4. Jean
5. Mike
- 第一个查询将给我:Mike、Jean、Jack
- 第二个:保罗,皮埃尔
但如果用户“Carla”在两个请求之间注册:
- 第一个查询仍然会给我:Mike、Jean、Jack
- >> Carla 注册并获得 ID 6
- 第二个:杰克、保罗、皮埃尔
结论是,我的表中会出现两次“Jack”记录。
这个问题看起来很可笑,但你知道如何避免吗?
PS : 我不知道你是否注意到了,但 Facebook 似乎有一个类似的问题,当你向下滚动新闻提要时,你可以看到多次相同的项目。这一定是一个更复杂的问题,但想法是一样的。
【问题讨论】:
-
是的,我愿意(使用 Ebean 作为 ORM),但我将问题保留为通用问题,因为它更多的是算法问题,而不是特定于数据库的问题。
标签: mysql sql pagination ebean