首页 > 解决方案 > 一个网站的两个用户之间的对话类型收件箱消息

问题描述

我想实现两个用户之间的对话类型收件箱消息,其中对话将在两个用户之间分组并显示在收件箱页面上,当单击对话时,两个用户之间将显示整体聊天历史......我有一个数据库模式,但未能将两个用户之间的对话分组。我需要一个查询来实现这一点谢谢这里是我的表。

1.用户:

2.对话:

3.消息:

所以如果有人知道如何实现这个查询然后帮助我也改变我的模式将不胜感激谢谢

标签: mysqlsqldatabase

解决方案


您可以使用如下所示的查询通过对话获取当前用户与最后一条消息的所有对话:

SELECT users.id,
       users.name,
       messages.conversation_id,
       messages.message_id,
       messages.message_text,
       messages.message_date,
       messages.seen
FROM
  (SELECT conversations.conversation_id,
          IF(conversations.from_user = <current_user_id>, conversations.to_user, conversations.from_user) AS interlocutor_id,
          max(messages.message_id) AS last_message_id
   FROM conversations
   LEFT JOIN messages ON conversations.conversation_id = messages.conversation_id
   WHERE convesations.from_id = <current_user_id>
     OR conversations.to_id = <current_user_id>
   GROUP BY conversations.conversation_id) AS t
LEFT JOIN users ON users.id = t.intercolutor_id
LEFT JOIN messages ON messages.message_id = t.last_message_id

如果您需要使用以下命令获取当前用户的所有对话以及最后的索引消息:

SELECT users.id,
       users.name,
       messages.conversation_id,
       messages.message_id,
       messages.message_text,
       messages.message_date,
       messages.seen
FROM
  (SELECT conversations.conversation_id,
          IF(conversations.from_user = <current_user_id>, conversations.to_user, conversations.from_user) AS interlocutor_id,
          max(messages.message_id) AS last_message_id
   FROM conversations
   LEFT JOIN messages ON conversations.conversation_id = messages.conversation_id
   WHERE (convesations.from_id = <current_user_id>
          OR conversations.to_id = <current_user_id>)
     AND messages.user_id <> <current_user_id>
   GROUP BY conversations.conversation_id) AS t
LEFT JOIN users ON users.id = t.intercolutor_id
LEFT JOIN messages ON messages.message_id = t.last_message_id

但我认为,如果你重写你的数据库方案并且你将在“对话”表中添加最后一条消息的 id,那不是更好的方法。它将使查询更优化

更新:

如果您需要获取与当前用户对话的所有用户的列表:

SELECT t.conversation_id,
       users.id,
       users.name
FROM
  (SELECT conversation_id,
          IF(from_user = <current_user_id>, to_user, from_user) AS interlocutor_id          
   FROM conversations   
   WHERE from_id = <current_user_id>
     OR to_id = <current_user_id>) AS t
LEFT JOIN users ON users.id = t.intercolutor_id

PS您必须替换<current_user_id>为当前用户的实际标识符


推荐阅读