mysql - 一个网站的两个用户之间的对话类型收件箱消息
问题描述
我想实现两个用户之间的对话类型收件箱消息,其中对话将在两个用户之间分组并显示在收件箱页面上,当单击对话时,两个用户之间将显示整体聊天历史......我有一个数据库模式,但未能将两个用户之间的对话分组。我需要一个查询来实现这一点谢谢这里是我的表。
1.用户:
- ID
- 用户名
- 密码
2.对话:
- 对话ID
- from_user
- to_user
3.消息:
- message_id
- 对话ID
- 用户身份
- message_text
- 消息日期
- 见过
所以如果有人知道如何实现这个查询然后帮助我也改变我的模式将不胜感激谢谢
解决方案
您可以使用如下所示的查询通过对话获取当前用户与最后一条消息的所有对话:
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>
为当前用户的实际标识符
推荐阅读
- python - Python Bokeh - HoverTool:图形的坐标而不是数据点
- c++ - 我需要将数组声明为静态局部变量吗?
- python - 将python文件导入谷歌云中的vim时出现无休止的标签问题
- typescript - Moment.diff 不是函数
- java - Jetty 7.6 不编译 JSP 文件
- design-patterns - 管道和过滤器模式的替代方案
- javascript - Node.js 护照 OAuth 2.0 身份验证:存储访问和刷新令牌的位置
- pandas - Pandas 合并指标自定义值
- python - 在指纹传感器 PYTHON 上无输入 15 秒后退出指纹程序
- javascript - 如何使用 node.js 捕获用户加载页面的屏幕