这是我从每个房间获取最新消息的查询:
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 |
+----------+-------+
那么,这是怎么回事?
我无法理解原因,我也需要对这些数据进行分页!
我能做什么,应该如何改变?
假设每页 3 行,偏移量需要为 1、4 和 7。
此外,如果没有
order by
子句,结果的顺序是不确定的。添加:
ORDER BY "Rooms"."id"