MySQL:从彼此关联的3个或4个表中获取最新的未读消息

时间:2018-11-29 19:00:27

标签: mysql

谢谢您的帮助!我对SQL很陌生。并感谢您通过我的详尽解释与我保持联系。只是要确保我详细:

我正在构建消息传递系统。我需要做的是按DESC的顺序检索1个或多个指定用户的最新未读消息。

这是我当前系统的结构:

可以在2个或更多用户和/或组之间创建一个conversation,并且每个用户和/或组都与该conversation相关联。 conversation中的用户/组可以互相发送messages

发送message时,它与conversation关联。然后,conversation中的每个用户/组都与该新的message相关联。

要存储所有这些,我有下表:

conversation
message
assoc_message__conversation
assoc_user_group__conversation
assoc_user_group__message

我将以下db-fiddle及其表结构和示例数据插入其中:

https://www.db-fiddle.com/f/s5bU15eVSxb5TDXy2GVtUS/0

如您所见,我进行了4个对话,每个对话包含2条消息-“第一条消息”和“最后一条消息”。

假设我是用户u-1000001和组g-1000001。您可以看到此用户和组在对话1、2和3中在一起。通过查看assoc_user_group__message表,您还可以看到此用户和组已经阅读了会话1中的两条消息。

我需要做的是能够指定u-1000001和/或g-1000001,并按指定的用户和/或群组所在的每次会话检索最新的未读消息。最新未读邮件DESC(由message_id而非send_datetime发出)。我还需要能够指定一个message_id来在第一个请求之前检索X数量的未读消息,或者在第一个请求之后检索X数量的新的未读消息(message_id < 4message_id > 4

我需要为每个未读消息检索以下字段:conversation_idmessage_idmessagesend_datetimeraw_iduser_type 。您可以看到这些字段跨越4个不同的表:messageassoc_user_group__messageassoc_user_group__conversationassoc_message__conversation

以下是我输入u-1000001g-1000001(忽略字段send_datetime)时应检索的内容的示例:

| conversation_id | message_id | message  | raw_id  | user_type |
-----------------------------------------------------------------
|               3 |          6 | Last Msg | 1000001 | user      |
-----------------------------------------------------------------
|               2 |          4 | Last Msg | 1000001 | group     |
-----------------------------------------------------------------
|               2 |          4 | Last Msg | 1000001 | user      |
-----------------------------------------------------------------

如果只输入u-1000001,我将得到相同的结果,只是没有组行。您会看到conversation_id 1被省略了,因为用户和组都已阅读该会话中的消息。

我知道这是一个复杂的问题,但是我非常感谢您的时间和帮助!

0 个答案:

没有答案