【问题标题】:How can I tell if there is more data after a query with LIMIT?使用 LIMIT 查询后如何判断是否有更多数据?
【发布时间】:2023-10-22 09:16:01
【问题描述】:

我在 InfluxQL 查询中使用 LIMITOFFSET 来处理分页。

例如,在有 3 行的测量中。

> SELECT *::field FROM i2QYtZBVSnuXjLhQhuAV6w;
name: i2QYtZBVSnuXjLhQhuAV6w
time                 hello
----                 -----
2018-02-23T18:00:00Z 1000
2018-02-23T18:30:00Z 1200
2018-02-23T19:00:00Z 990

假设我使用LIMITOFFSET 逐行读取:

> SELECT *::field FROM i2QYtZBVSnuXjLhQhuAV6w LIMIT 1;
name: i2QYtZBVSnuXjLhQhuAV6w
time                 hello
----                 -----
2018-02-23T18:00:00Z 1000
> SELECT *::field FROM i2QYtZBVSnuXjLhQhuAV6w LIMIT 1 OFFSET 1;
name: i2QYtZBVSnuXjLhQhuAV6w
time                 hello
----                 -----
2018-02-23T18:30:00Z 1200
> SELECT *::field FROM i2QYtZBVSnuXjLhQhuAV6w LIMIT 1 OFFSET 2;
name: i2QYtZBVSnuXjLhQhuAV6w
time                 hello
----                 -----
2018-02-23T19:00:00Z 990

有没有办法在不执行额外查询的情况下知道之后没有更多数据?

编辑:我的用例是为面向用户的 REST API 生成“下一页令牌”。我想避免给用户一个只会返回空行集的令牌。

【问题讨论】:

  • 可以提前数数,到数就停止。 “SELECT COUNT(column_name) FROM series_name group by time(10m)”。显然,自第一次计数以来,可能会有更多数据进入数据库 - 但如果您想要实时流式传输,那是另一种情况,您需要 Kapacitor。根据您的实现,另一种选择是捕获空结果并停止分页。
  • 感谢您的提示。我想到了第一种方法,但它仍然是一个额外的请求。如果我找不到另一条路,我会沿着这条路走。第二种方法有一个错误的情况:当行集是页面的精确倍数时。那么就没有办法知道了。

标签: pagination time-series influxdb


【解决方案1】:

为避免额外查询,您始终可以使用 limit as (limit + 1) 进行 DB 查询。

Ex:如果实际限制为 5,则将限制设置为 6,并且仅当结果集有 6 行时才给出下一页标记。另外,只将 5 行的数据返回给客户端。

【讨论】: