我有以下查询
SELECT u.update_time, about_me
FROM users u
ORDER BY date_bin('14 days', u.update_time, '2023-04-07 23:11:56.471560Z') DESC, LENGTH(u.about_me) DESC, u.user_id;
我得到以下信息:
更新时间 | 关于我 |
---|---|
2023-04-06 19:59:56.771388 +00:00 | 你好!你好吗? |
2023-04-02 03:31:09.833925 +00:00 | 你好!!! |
2023-04-06 00:36:26.822102 +00:00 | 你好! |
2023-04-05 19:16:20.968274 +00:00 | 嘿! |
我现在只想得到第三行之后的所有内容。所以我会做以下事情:
SELECT u.update_time, about_me
FROM users u
WHERE (date_bin('14 days', u.update_time, '2023-04-07 23:11:56.471560Z'), LENGTH(u.about_me)) <
('2023-04-07 03:05:24.990233 +00:00', 6)
ORDER BY date_bin('14 days', u.update_time, '2023-04-07 23:11:56.471560Z') DESC, LENGTH(u.about_me) DESC, u.user_id;
但问题是我仍然得到完全相同的结果,就好像 WHERE 不工作一样。如何对查询进行分页?
弄清楚你的情况。首先,正确的表定义。我们需要一个 PK 或类似的东西来明确地打破平局:
该列
update_time
是类型timestamptz
。继续与 一起工作timestamptz
,不要与 混在一起timestamp
。接下来,示例行以展示可能的问题:
正确的基本查询:
'2023-04-07 23:11:56+0'
成为你的任意(但不变!)时间锚。值得注意的是,您添加了
user_id
第三个表达式来ORDER BY
打破平局。那挺好的。但是如果你想继续使用Row Constructor Comparison,所有 3 个表达式必须共享相同的排序方向。全部ASCENDING
或全部DESCENDING
。(否则它会变得更加复杂和昂贵。)参见:另外,添加
user_id
到列表中SELECT
。这对您的分页至关重要。然后,获取示例页面大小为3的第一页:
第二页:
小提琴
('2023-03-25 00:11:56+01', 8, 5)
从第一页的最后一行派生。'2023-03-25 00:11:56+01'
是表达式的结果date_bin()
。为简单起见,您可以将其添加到SELECT
列表中。(我在小提琴中添加了它。)由于您的
date_bin()
表达式使用任意时间锚点(和间隔?),因此使用索引很复杂,但仍然可行。使用可能值的下限/上限date_bin()
......这两个
timestamptz
值完全相同:显示取决于您的会话设置,值是相同的。基本:
timezone