users tbl:
id
username
first_name
last_name
email_address
messages tbl:
id
date_sent
title
content
status
message_relation tbl:
id
message_id
sender_id
receiver_id
在给定这些表的情况下,向所选用户查询消息的最有效方法是什么?换句话说,我想列出userA的“收件箱”中的所有邮件
其次,您如何建议处理需要从管理员发送给所有人的全局消息?
答案 0 :(得分:1)
我认为这就是你要找的......
SELECT [WHATEVER] FROM
messages
INNER JOIN message_relation
ON (messages.id = message_relation.message_id AND message_relation.receiver_id = $id)
这有效地满足了您的要求。如果您还想在任一用户上选择字段,可以将Receiver_ID加入User_ID以获取该字段。
如果您需要全局/管理员消息,建议的表格设置:
Messages (Message_ID, [Fields common to all messages, e.g. Message_Content, Message_Timestamp, etc])
Global_Messages (Global_Message_ID, Message_ID, [any fields specific to Global_Messages])
User_Messages (User_Message_ID, Message_ID, [any fields specific to User_Messages])
User_Message_Relations (User_Message_Relations_ID, User_Message_ID, Sender_ID, Receiver_ID)
然后,查询收件箱,例如:
SELECT [WHATEVER] FROM
Messages
LEFT JOIN (Global_Messages)
ON (Messages.Message_ID = Global_Messages.Message_ID)
LEFT JOIN (User_Messages)
ON (Messages.Message_ID = User_Messages.Message_ID)
LEFT JOIN (User_Message_Relations)
ON (User_Messages.User_Message_ID = User_Message_Relations.User_Message_ID AND User_Message_Relations.Receiver_ID = $uid)
这将为您提供一个结果,您可以循环访问以获取用户的整个收件箱。
答案 1 :(得分:1)
SELECT
m.id, m.date_sent,m.title,m.content,m.status
FROM
messages m
INNER JOIN
message_relation mr on (mr.message_id = m.id)
INNER JOIN
users u on (u.id = mr.receiver_id);
WHERE u.id = ...your current user id ...
这是一种简单的方法,它可以快速而且几乎没有负载数据库