1

我正在开发一个应用程序,该应用程序使用 20 个左右的滚动加载系统,在您滚动时一次将结果加载到提要中。此提要由不断添加的用户生成内容组成。这意味着结果集可以更改每个偏移 X 的查询。

假设我们加载了 20 个结果,然后滚动,再滚动 20 个,然后在滚动更多以加载下一个 20 之前,另一个用户上传了一条新内容,这实际上会在下一组 20 个结果中显示重复feed 因为我们使用 OFFSET 来获得额外的结果,并且总的结果集被移动了 1,因为添加了符合查询条件的新内容。

解决这个问题的最好和最有效的方法是什么?我们已经尝试在 where 条件中使用行的 id 来防止重复结果,并且只对获取的新结果使用不带偏移量的限制。所以我们可以执行 WHERE id < 170 LIMIT 20,WHERE id < 150 LIMIT 20, WHERE id < 130 LIMIT 20, etc.. 以控制和防止重复...但是,这在所有可能的情况下都不起作用,因为我们的结果集并不总是按 DESC 排序的 id 列排序。

Soo.. 还有哪些其他选择?

4

2 回答 2

1

为什么要使用该where子句而不是limit使用 offset 选项? Limit可以接受两个参数。这个offset论点似乎正是你想要的。例如:

limit 100, 20

从第 101 行开始占用 20 行。然后:

limit 120, 20

从第 121 行开始占用 20 行。(在 MySQL 计数中,偏移量从 0 而不是 1 开始。)

您需要进行的一项改进是确保记录的排序顺序是稳定的。本质上,稳定排序是没有具有相同值的排序键的排序。要做到这一点,只需将该id列设置为排序中的最后一列。它是唯一的,所以如果有任何重复的排序键,那么添加id会使排序稳定。

于 2013-09-08T12:55:44.737 回答
0

您可能想尝试数据库解决方案。在初始请求中,创建并填充一个表。使用该表作为提要。

确保表名以一致的名称开头,例如 TableToFeedMyApp,并以保证使其唯一的名称结尾。然后设置一个计划的作业来查找并删除所有这些在您认为是某个时间间隔之前创建的表。

于 2013-09-08T11:58:16.227 回答