postgres MAX() 查询中的分页错误

问题描述 投票:0回答:1

这是我从每个房间获取最新消息的查询:

SELECT MAX
    ( "Messages"."id" ) AS messageId,
    "Rooms"."id" 
FROM
    "RoomUsers"
    INNER JOIN "Rooms" ON "RoomUsers"."roomId" = "Rooms"."id"
    INNER JOIN "Conversations" ON "Conversations"."roomId" = "Rooms"."id"
    INNER JOIN "Messages" ON "Messages"."conversationId" = "Conversations"."id" 
WHERE
    "RoomUsers"."userId" = 51
GROUP BY
    "Rooms"."id" 

输出可能是这样的:

+----------+-------+
|messageId |   id  |
+----------+-------+
|    1     |   4   |
|    17    |   5   |
|    7     |   6   |
|    29    |   7   |
|    18    |   8   |
|    19    |   9   |
+----------+-------+

如您所见,这只是一个小结果集,但如果我有超过 1000 个包含消息的房间,它可能会成为一个大型数据集,并且一次获取所有数据对于应用程序来说并不高效或不必要。

所以,我想使用OFFSET和LIMIT来实现分页。

为了测试,我从小页面开始。

我修改了查询,以每页 3 条记录对数据进行分页:

SELECT MAX
    ( "Messages"."id" ) AS messageId,
    "Rooms"."id" 
FROM
    "RoomUsers"
    INNER JOIN "Rooms" ON "RoomUsers"."roomId" = "Rooms"."id"
    INNER JOIN "Conversations" ON "Conversations"."roomId" = "Rooms"."id"
    INNER JOIN "Messages" ON "Messages"."conversationId" = "Conversations"."id" 
WHERE
    "RoomUsers"."userId" = 51
GROUP BY
    "Rooms"."id" 
    LIMIT 3 OFFSET 0

运行此查询后,这是输出:

+----------+-------+
|messageId |   id  |
+----------+-------+
|    1     |   4   |
|    17    |   5   |
|    7     |   6   |
+----------+-------+

仅此页面就可以了。如果我添加一个页面并将偏移量更改为 1,这就是结果:

+----------+-------+
|messageId |   id  |
+----------+-------+
|    17    |   5   |
|    7     |   6   |
|    29    |   7   |
+----------+-------+

如果我增加偏移量并将其更改为 2,这就是下一个结果:

+----------+-------+
|messageId |   id  |
+----------+-------+
|    7     |   6   |
|    29    |   7   |
|    18    |   8   |
+----------+-------+

那么,这是怎么回事?

我无法理解原因,我也需要对这些数据进行分页!

我能做什么,应该如何改变?

typescript postgresql sequelize.js
1个回答
0
投票

假设每页 3 行,偏移量需要为 1、4 和 7。

此外,如果没有

order by
子句,结果的顺序是不确定的。添加:

ORDER BY "Rooms"."id"
© www.soinside.com 2019 - 2024. All rights reserved.