假设我有这张桌子:
+--------+----------+
| ID | Name |
+--------+----------+
| 1 | John |
+--------+----------+
| 2 | Mike |
+--------+----------+
| 3 | Bob |
+--------+----------+
我正在尝试使用游标方法(Relay / GraphQL)进行分页。
现在,如果用户要求从ID 1到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,而不是光标内容需要的第二个。
有没有办法获得PENULTIMATE LAST_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;
注意,没有LAST_VALUE()
的ORDER BY
返回任意值。看起来好像是“最后一个值”,但这只是巧合,不能保证。
类似地,没有LIMIT
的ORDER BY
返回任意行。它可能看起来像前三个或最后三个,但这只是巧合,不能保证。
使用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;