在顺序更改时使用 LIMIT 从 table 读取数据
Reading data from table using LIMIT while the order changes
好吧,我来解释一下。
您知道 Facebook Messenger 和 Discord 如何拥有最后一条消息的好友列表吗?它是你所有朋友的列表由最后给你发短信的人排序。现在,如果该列表中有超过 100 人,最好将列表以 10 的块发送给客户。一旦客户端到达底部,它就会请求下一个 10。这可以通过 LIMIT offset, amount
.
来完成
但是现在,问题。用户可能会打开 Messenger,与某人交谈 10 分钟,然后在上次发送消息的朋友列表中进一步向下滚动。在这种情况下,table 在用户检索到完整列表之前已更改。数据库中的列表现在以不同的顺序排列,因为同时有人给他们发了消息,现在位于列表的顶部,但是客户端已经有了列表的第一块,但这不包含发短信给他们的人。
如果我的解释还不够,这里有一个视觉演示:
视觉演示
'Last messaged friends' 数据库中的列表(按最新时间戳排序):
- 第 23 个人
- 第 77 个人
- 第 93 个人
- 第 99 个人
- 第 67 个人
- 第 85 个人
用户连接,请求前 3 个条目。
客户端现在有(按最新时间戳排序):
- 第 23 个人
- 第 77 个人
- 第 93 个人
'Person 99' 该用户的留言。 'Person 99' 现在位于列表顶部。
'Last messaged friends' 数据库中的列表(按最新时间戳排序):
- 第 99 个人
- 第 23 个人
- 第 77 个人
- 第 93 个人
- 第 67 个人
- 第 85 个人
用户向下滚动。客户要求提供接下来的 3 个条目。
客户端现在有(按最新时间戳排序):
- 第 23 个人
- 第 77 个人
- 第 93 个人
- 第 93 个人(重复)
- 第 67 个人
- 第 85 个人
('Person 99' 缺失)
我可以 fix/implement 使用更高级的 SQL 查询吗?
如果我不能,我怎么能以其他方式实现它?
有关信息,我在服务器和客户端之间有一个 Socket.io(a.k.a 更高级的 WebSocket)连接,我可以通过它发送任何必要的信息。
听起来你想要聚合以避免重复:
select person_id
from messages
group by person_id
order by max(timestamp) desc;
谢谢 Hector Vido 的建议。 (他在我的问题下方发表了评论,去投票)
“按时间戳选择消息不能解决这个问题?您保留最后一个时间戳,然后通过另外 10 个注册表询问 >= 该时间戳”
解决方案
我会在客户端保留 oldest 和 newest 时间戳。
如果客户端向下滚动,我会在 oldestTimestamp
之前请求 10 个条目,然后新的 oldestTimestamp
将是收到的条目中最早的时间戳。
另外,每 10 秒后,我可以在 newestTimestamp
之后请求条目,然后新的 newestTimestamp
将是接收到的条目的最新时间戳。
好吧,我来解释一下。
您知道 Facebook Messenger 和 Discord 如何拥有最后一条消息的好友列表吗?它是你所有朋友的列表由最后给你发短信的人排序。现在,如果该列表中有超过 100 人,最好将列表以 10 的块发送给客户。一旦客户端到达底部,它就会请求下一个 10。这可以通过 LIMIT offset, amount
.
但是现在,问题。用户可能会打开 Messenger,与某人交谈 10 分钟,然后在上次发送消息的朋友列表中进一步向下滚动。在这种情况下,table 在用户检索到完整列表之前已更改。数据库中的列表现在以不同的顺序排列,因为同时有人给他们发了消息,现在位于列表的顶部,但是客户端已经有了列表的第一块,但这不包含发短信给他们的人。
如果我的解释还不够,这里有一个视觉演示:
视觉演示
'Last messaged friends' 数据库中的列表(按最新时间戳排序):
- 第 23 个人
- 第 77 个人
- 第 93 个人
- 第 99 个人
- 第 67 个人
- 第 85 个人
用户连接,请求前 3 个条目。 客户端现在有(按最新时间戳排序):
- 第 23 个人
- 第 77 个人
- 第 93 个人
'Person 99' 该用户的留言。 'Person 99' 现在位于列表顶部。
'Last messaged friends' 数据库中的列表(按最新时间戳排序):
- 第 99 个人
- 第 23 个人
- 第 77 个人
- 第 93 个人
- 第 67 个人
- 第 85 个人
用户向下滚动。客户要求提供接下来的 3 个条目。
客户端现在有(按最新时间戳排序):
- 第 23 个人
- 第 77 个人
- 第 93 个人
- 第 93 个人(重复)
- 第 67 个人
- 第 85 个人
('Person 99' 缺失)
我可以 fix/implement 使用更高级的 SQL 查询吗?
如果我不能,我怎么能以其他方式实现它?
有关信息,我在服务器和客户端之间有一个 Socket.io(a.k.a 更高级的 WebSocket)连接,我可以通过它发送任何必要的信息。
听起来你想要聚合以避免重复:
select person_id
from messages
group by person_id
order by max(timestamp) desc;
谢谢 Hector Vido 的建议。 (他在我的问题下方发表了评论,去投票)
“按时间戳选择消息不能解决这个问题?您保留最后一个时间戳,然后通过另外 10 个注册表询问 >= 该时间戳”
解决方案
我会在客户端保留 oldest 和 newest 时间戳。
如果客户端向下滚动,我会在 oldestTimestamp
之前请求 10 个条目,然后新的 oldestTimestamp
将是收到的条目中最早的时间戳。
另外,每 10 秒后,我可以在 newestTimestamp
之后请求条目,然后新的 newestTimestamp
将是接收到的条目的最新时间戳。