假设我有这个表:
+--------+----------+
| ID | Name |
+--------+----------+
| 1 | John |
+--------+----------+
| 2 | Mike |
+--------+----------+
| 3 | Bob |
+--------+----------+
我正在尝试使用游标方法(Relay/GraphQL(进行分页。
现在,若用户要求从ID 1到ID 2的玩家,我需要一种方法来了解表中是否有更多的玩家。
我认为一种方法是使用LIMIT
2(请求的最后一个ID(+1=3。
所以我使用这个查询:
SELECT
*
FROM
"players"
LIMIT 3
在我的后端代码中,我删除了最后一行,并将hasNextPage
计算为true和游标内容(ID 2(。
我正试图找到一种使用SQL来完成这项繁重工作的方法。
我可以使用下面的代码创建一个OVER ()
(虚拟(列吗?
SELECT
*,
LAST_VALUE ( ID ) OVER ( ) AS pageInfo
FROM
"players"
LIMIT 3
它有效,但LAST_VALUE( ID )
向我显示了第三个ID,而不是光标内容所需的第二个ID。
有办法获得PENULTIMATELAST_VALUE ( ID )
吗
您可以使用nth_value()
:
SELECT p.*,
LAST_VALUE ( ID ) OVER ( ORDER BY ID ) AS pageInfo,
NTH_VALUE(ID, 2) OVER (ORDER BY ID DESC) as page_Info_penultimate
FROM "players" p
LIMIT 3;
请注意,不带ORDER BY
的LAST_VALUE()
返回任意值。它看起来可能是"最后一个值",但这是巧合,不能保证。
类似地,没有ORDER BY
的LIMIT
返回任意行。它可能看起来像前三个或后三个,但这是巧合,不能保证。
像这样使用LAST_VALUE()
似乎很神秘。MAX()
似乎更口语化:
SELECT p.*,
MAX ( ID ) OVER () AS lastvalue,
NTH_VALUE(ID, 2) OVER (ORDER BY ID DESC) as penultimatevalue
FROM "players" p
LIMIT 3;