一个网站的两个用户之间的对话类型收件箱消息

qf9go6mv  于 2021-06-19  发布在  Mysql
关注(0)|答案(2)|浏览(324)

我想在两个用户之间实现对话类型收件箱消息,其中对话将在两个用户之间分组并显示在收件箱页面上,当单击对话时,整个聊天历史将在两个用户之间显示。。。。我有一个数据库架构,但未能对两个用户之间的对话进行分组。我需要一个查询来完成此任务谢谢这是我的表。
1.用户:
身份证件
用户名
密码
2.对话:
会话\u id
来自用户
发送给用户
3.信息:
消息\u id
会话\u id
用户id
消息\u文本
消息\u日期
看到
因此,如果有人知道如何实现这个查询,那么帮助我也改变我的模式将不胜感激谢谢

gr8qqesn

gr8qqesn1#

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

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

如果需要使用以下方法获取当前用户与最后一条indox消息的所有对话:

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

但我认为最好的方法是重写数据库方案,并在“conversations”表中添加最后一条消息的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

p、 你必须替换 <current_user_id> 到当前用户的实际标识符

bkkx9g8r

bkkx9g8r2#

SELECT conversation FROM
        conversations

WHERE (conversations.from_user = <user parameter>
OR conversations.to_user = <user parameter>) 
AND conversations.from_user <> conversations.to_user

相关问题