通常,在对SQL查询进行分页时,我们使用offset和limit来选择行页面。但是,如果在OFFSET
之前,在页面请求之间插入或删除了行,则对下一页的请求将跳过行或复制先前的行。
考虑像
这样的查询SELECT id FROM t
ORDER BY // a complex, dynamic order clause
OFFSET ? LIMIT ?
在以下场景中:
OFFSET=0 LIMIT=1
OFFSET=1 LIMIT=1
应该在#3中返回的行实际上会被OFFSET=1
隐藏。
如果有办法说“在id = [last row's id]”的行之后给我下一行m而不是“跳过n行然后给我m行”,这可以非常简单地避免。是否有运营商在MySQL中执行此操作?基本上,我正在寻找CouchDB的startkey
。
答案 0 :(得分:2)
不确定。如果您要对三列ORDER BY a, b, c
进行排序,并且知道您显示的最后一条记录的值为a0, b0, c0
,那么这些列与PK id0
一样,那么您可以执行以下操作:
WHERE (a, b, c, pk) > (a0, b0, c0, id0)
ORDER BY a, b, c, pk
LIMIT m -- don't bother with offset anymore