查询私人消息系统

时间:2011-06-08 08:26:35

标签: php mysql sql database-design messaging

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

1) users (id, name)
2) messages(id, text, created)
3) user_has_messages(id, user_id, message_id, is_sender)

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

问题是我无法为此任务构建正确的查询。也许糟​​糕的数据库设计?

2 个答案:

答案 0 :(得分:1)

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

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 :(得分:0)

我认为数据库设计可能有误,因为如果收件人删除了他的邮件(通过删除user_has_messages行),则发件人将无法再看到他们将邮件发送给谁 - 信息丢失。

如果邮件总是有一个发件人和一个收件人,那么我会有以下表格:

1) users (id, name)
2) messages(id, text, created, sender_id, recipient_id,
            deleted_by_sender, deleted_by_recipient)

即使采用这种简化设计,您的要求的SQL也有点复杂:

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)是唯一的密钥)。