首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >私信系统查询

私信系统查询
EN

Stack Overflow用户
提问于 2011-06-08 16:26:35
回答 2查看 1.6K关注 1票数 1

我正在使用mysql制作私人消息系统。创建了以下表格:

代码语言:javascript
运行
复制
1) users (id, name)
2) messages(id, text, created)
3) user_has_messages(id, user_id, message_id, is_sender)

表user_has_messages存储消息历史记录,因此有2行(“发送者”用户和“接收者”用户)。每条消息。每条消息2行,因为发送者应该看到他的消息,即使接收者删除了它。所以我需要为具体的用户获取所有对话框的列表,最后一条消息在它里面。如果你看一看这张照片,应该更容易理解:Explanation

问题是我不能为这个任务构造一个合适的查询。也许是糟糕的数据库设计?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-09 15:27:47

看起来这个查询就是我需要的:

代码语言:javascript
运行
复制
SELECT * FROM users_has_messages uhm1 
WHERE uhm1.message_id=(
       SELECT message_id FROM users_has_messages uhm2 
       WHERE (uhm1.receiver_id=uhm2.receiver_id AND uhm1.sender_id=uhm2.sender_id) 
       OR uhm1.receiver_id=uhm2.sender_id ORDER BY message_id DESC limit 1) 
AND user_id=1 
票数 1
EN

Stack Overflow用户

发布于 2011-06-08 19:12:07

我相信数据库设计可能是错误的,因为如果收件人删除了他的邮件(通过删除user_has_messages行),那么发件人就不能再看到他们将邮件发送给了谁-信息就会丢失。

如果一条消息总是有一个发送者和一个接收者,那么我会有这样的表:

代码语言:javascript
运行
复制
1) users (id, name)
2) messages(id, text, created, sender_id, recipient_id,
            deleted_by_sender, deleted_by_recipient)

即使有了这种简化的设计,满足您的需求的SQL也有点复杂:

代码语言:javascript
运行
复制
select m.recipient_id, m.text
from messages m
where m.sender_id = ?
and m.created = (select max(created)
                 from messages m2
                 where m2.sender_id = m.sender_id
                 and m2.recipient_id = m.recipient_id
                 and m2.deleted_by_sender = 0
                 and m2.deleted_by_recipient = 0);

(并且假设(sender_id,recipient_id,created)是唯一的键)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6276092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档