情境: 我正在显示一个记录表。它最初在底部显示前500,“显示更多”,返回下一个500。
问题: 如果在初始显示和单击“显示更多”1记录之间添加,则会导致“按日期排序,偏移500,限制500”重叠1行。
我想“按日期排序,偏移到'显示最后一行的ID',限制500”
我的行ID是UUID。我对采用相同结果的替代方法持开放态度。
答案 0 :(得分:1)
如果您可以按ID订购,则可以使用
进行分页where id > $last_seen_id limit 500
但在按date
排序的情况下,这不会有用。
我真的希望" date"实际上意味着"时间戳"但是,否则你的订购会不稳定,你可能会错过分页行;如果date, id
真的是date
,您必须按timestamp
订购以获得稳定的订购,即使是where date > $last_seen_date and id > $last_seen_id limit 500
,也应该这样做。
一种选择是将状态推送到客户端。让客户端记住最后看到的(日期,id)元组,并使用:
LIMIT
您是否关心可扩展性?如果没有,您可以使用服务器端游标。在没有FETCH
的情况下为完整查询声明游标。然后根据请求CREATE TABLE sessiondata.myuser_myrequest_blah AS SELECT ....
行的行。为此,您的应用必须能够始终如一地将连接绑定到特定用户的请求,而不是重置该连接或在请求之间将其返回到池。这对您的池/框架可能不实用,但如果可以的话,这可能是最好的解决方案。
另一个可扩展性较低的选项是{{1}},然后将表表分页。它保证不会改变。这避免了需要在请求之间保持一致连接的困难,但是第一次请求响应时间非常慢,对于大量用户计数或大量数据而言是完全不切实际的。
答案 1 :(得分:1)
我认为您可以在哪里使用子查询来完成此操作。
例如假设您要通过users
表进行分页,并且希望记录在给定用户之后:
SELECT *
FROM users
WHERE created_at > (
SELECT created_at
FROM users
WHERE users.id = '00000000-1111-2222-3333-444444444444'
LIMIT 1
)
ORDER BY created_at DESC limit 5;