题
如果您知道如何更好地提出问题,请随意编辑标题。(标记也是一个问题。)这个问题在这种一般形式中可能太难了,所以让我们考虑一个具体的例子。
您可以通过请求获得一屏 stackoverflow 问题 /questions ?sort=newest
页。下一页链接指向 /questions?page=2 &sort=newest
. 。我想在服务器端,请求被转换为带有 LIMIT 子句的 SQL 查询。这种方法的问题是,如果在用户浏览第一页时添加新问题,他的第二页将以他已经看到的一些问题开始。(如果他每页有 10 个问题,并且恰好添加了 10 个新问题,那么他第二次会得到完全相同的内容!)
有没有一种优雅的方法来解决这个常见问题?我意识到这并不是一个大问题,至少对于 stackoverflow 来说不是,但仍然如此。
我最好的想法(除了存储每个客户端的请求历史记录之外)是使用 /questions?answer_id=NNN
格式。服务器返回一个以请求的答案开头的页面,并将下一页的第一个答案的 id 放入下一页链接中。一定有办法为此编写 SQL,对吗?
通常都是这样做的吗?或者有更好的方法吗?
解决方案
这不是一个简单的方法就能完成的。例如,stackoverflow 上的“未答复”列表是按投票数排序的。因此,如果您保存正在查看的页面的最后一个 ID(在 cookie、请求、会话等任何位置),并且在您浏览第 2 页时有人对某个帖子进行了投票,则第 3 页将不完整,因为最近投票的帖子帖子可能已移至第 1 页或第 2 页。
唯一的方法是在某人的会话中加载完整的列表。请不要...
正如已经提到的,我们希望人们现在已经习惯了这一点。
其他提示
我见过的大多数网站都没有解决这个问题 - 它们向您显示一个页面,其中包含您已经看过的一些内容。
您可能会认为这是一个功能 - 当您单击“下一步”并看到以前看过的一些内容时,这是一个信号,表明您想再次返回前面,因为有一些新内容。
用输入数据库的时间标记每个问题,将首页上次加载的时间作为 cookie 或 URL 的一部分,并将搜索限制为项目 n
通过 n+displaynum
当你前进时。
但我不会打扰。这种行为足够一致,大多数用户都期望它,并且它可以作为新数据可用时的标志。您甚至可以打开一个从列表顶部开始的新选项卡/窗口,以查看出现的内容。
我相信 SQL(对于 MySQL)将是:
SELECT *
FROM entries
WHERE entry_id >= @last_viewed_entry_id
ORDER BY entry_id
LIMIT 50