【发布时间】:2021-04-15 06:31:15
【问题描述】:
我想在我的宠物项目中添加一个信使,但我在编写数据库查询时遇到了困难。我将 MySQL 用于此服务,并将 Hibernate 作为 ORM。几乎所有查询都是用 HQL 编写的,但原则上我可以使用原生查询。
Messenger 可以包含群组对话。除了写消息,用户还可以进入、离开、清除个人消息历史。用户在对话中看到所有消息,但他也可以清除历史记录,只看到上次清除后的消息。
下面我描述了对这项任务很重要的两个表的简化结构。
消息表:
| ID | text | timestamp |
|---|---|---|
| 1 | first_msg | 1609459200 |
| 2 | second_msg | 1609545600 |
会员事件表:
| id | user_id | type | timestamp |
|---|---|---|---|
| 1 | 1 | 1 | 1609459100 |
| 2 | 1 | 3 | 1609459300 |
| 3 | 1 | 2 | 1609459400 |
| 4 | 1 | 1 | 1609545500 |
where type:
1 - user entered the chat,
2 - user leaved the chat,
3 - user cleared his own history of messages in the chat
是否可以通过一个请求读取用户可用的所有聊天消息?
我不知道如何动态检查条件:WHERE 消息的时间戳在所有“进入-离开”周期之间,如果没有离开,则在最后一次“进入”之后,但仅在最后一次历史清除之后。如果存在。
【问题讨论】:
-
你的 MySQL 版本是什么?
-
@trincot MySQL 的版本是 8.0.20
-
究竟什么时候进入-离开被读取?如果最后一个事件是 2?好像第 4 行在 member_event 中不存在?那么历史清除不重要?
-
除非事件类型为 2,否则与在上次活动时及之后阅读所有消息有何不同?
标签: mysql sql join hql between