2011-06-08 169 views
1

我正在使用mysql进行私人消息系统。创建此表:查询私人消息系统

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

表user_has_messages存储短信历史,所以有2行(对于“发送者”的用户和为“接收器”的用户。)每1个消息。每条消息2行,因为即使接收者删除了它,发件人也应该看到他的消息。 所以我需要获取具有最后一条消息的具体用户的所有对话框列表。如果你看一下这张图,应该会比较容易:Explanation

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

回答

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 
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)是唯一键)。

+0

又是怎么回事事实上,在对话框中的最后一条消息可以属于“发件人”或“接收器”? – trerums 2011-06-08 12:23:53

+0

好点,我的SQL只处理用户发送的消息。 – 2011-06-08 12:26:33