【发布时间】:2013-09-12 01:08:51
【问题描述】:
我正在开发一个应用程序,该应用程序使用 20 左右的滚动加载系统,结果在您滚动时一次加载到提要中。此提要由不断添加的用户生成内容组成。这意味着结果集可以更改每个偏移 X 的查询。
假设我们加载了 20 个结果,然后滚动,再滚动 20 个,然后在滚动更多内容以加载下一个 20 个之前,另一个用户上传了一条新内容,这实际上会在下一组 20 个中显示重复内容结果,因为我们使用 OFFSET 来获得额外的结果,并且由于添加了符合查询条件的新内容,总结果集将移动 1。
解决此问题的最佳和最有效的方法是什么?我们已经尝试在 where 条件中使用行的 id 来防止重复结果,并且只对获取的新结果使用不带偏移量的限制。所以我们可以执行 WHERE id
Soo.. 还有哪些其他选择?..
【问题讨论】:
-
可能只获取一次完整的结果集,将其存储在用户会话中,然后从保存到会话的总结果集中引用提要的下 20 个结果 - 这需要保持不变并且不包括额外的用户内容?
-
这取决于您的数据。我会用不断增长的 id 和限制来尝试上面的事情,我只会从最后一个结果中取最大或最低的 id。总的来说,我喜欢您评论中的想法,但这需要记忆。假设您有 10k 个用户,并且您在会话中为每个用户存储 1MB,这将需要大约 10GB 的内存。
-
在现代浏览器中,会话变量的意外更改比以前更有可能发生。我自己也被这个烧死了。这是尽量减少对会话变量的依赖程度的另一个原因。
-
对,递增或递减 ID 方法的问题在于,我们在提要中返回的一些结果,在某些情况下,是按完全无视 ID 排序的搜索相关因子排序的,这意味着按 ID 降序排序不会以正确的搜索顺序显示数据。
-
另外,我们不能使用具有递减/递增相关值的 where 原因,因为 2 个或更多相关值有可能相同
标签: php mysql sql web-applications feed