您需要有额外的(或现有的)列,该列对于目标表中每个新添加的行依次增加。我们称此专栏为seq_id.
当客户端第一次请求游标时:
GET /api/v1/items?sort_by={sortingFieldName}&size={count}
其中 sortingFieldName 是我们应用排序的字段名称
幕后发生了什么:
SELECT * FROM items
WHERE ... // apply search params
ORDER BY sortingFieldName, seq_id
LIMIT :count
回复:
{
"data": [...],
"cursor": {
"prev_field_name": "{result[0].sortingFieldName}",
"prev_id": "{result[0].seq_id}",
"nextFieldName": "{result[count-1].sortingFieldName}",
"next_id": "{result[count-1].seq_id}",
"prev_results_link": "/api/v1/items?size={count}&cursor=bw_{prevFieldName}_{prevId}",
"next_results_link": "/api/v1/items?size={count}&cursor=fw_{nextFieldName}_{nextId}"
}
}
如果我们检索的行数少于 count 行,则游标的下一个不会出现在响应中。
如果请求中没有游标或没有要返回的数据,游标的前一部分将不会出现在响应中。
当客户端再次执行请求时 - 他需要使用游标。向前光标:
GET /api/v1/items?size={count}&cursor=fw_{nextFieldName}_{nextId}
幕后发生了什么:
SELECT * FROM items
WHERE ... // apply search params
AND ((fieldName = :cursor.nextFieldName AND seq_id > :cursor.nextId) OR
fieldName > :cursor.nextFieldName)
ORDER BY sortingFieldName, seq_id
LIMIT :count
或向后光标:
GET /api/v1/items?size={count}&cursor=fw_{prevFieldName}_{prevId}
幕后发生了什么:
SELECT * FROM items
WHERE ... // apply search params
AND ((fieldName = :cursor.prevFieldName AND seq_id < :cursor.prevId) OR
fieldName < :cursor.prevFieldName)
ORDER BY sortingFieldName DESC, seq_id DESC
LIMIT :count
响应将与前一个类似