我正在用PHP / MySQL编写一个基本的消息脚本,但我现在正陷入数据库查询。我会感激任何提示或帮助(:
我正在使用两个表,因为可以将消息发送给多个用户:
messages:
id | sender_id | subject | ...
message_receivers:
message_id | receiver_id | ...
我现在要做的是向用户显示他选择的消息。但我想显示用户在该对话中的整个消息历史记录(在浏览器中跳转到他选择的那个)。使用连接执行此操作非常简单:
SELECT * FROM messages
JOIN message_receivers
ON messages.id = message_receivers.message_id
WHERE sender_id = x
AND receiver_id = y
但现在我错过了其他信息接收者的信息!我不知道如何获取这些信息。有什么想法吗? (:
答案 0 :(得分:1)
如果要查看消息的所有接收者,请删除are子句的第二部分:
AND receiver_id = y
同时你要指定message_id,因为这会让前端的用户感到困惑
AND message_id = z
答案 1 :(得分:1)
再次加入message_receivers
表以检索邮件的其他收件人:
SELECT
m.id, m.sender_id, m.subject,
r.receiver_id AS recipient,
c.receiver_id AS carboncopy
FROM messages AS m
INNER JOIN message_receivers AS r
ON m.id = r.message_id
LEFT OUTER JOIN message_receivers AS c
ON r.message_id = c.message_id AND r.receiver_id != c.receiver_id
WHERE m.sender_id = x AND r.receiver_id = y
您感兴趣的收件人将在recipient
列中(在每个结果记录中)。其他收件人将在carboncopy
列中(每个结果记录一个)。如果carboncopy
为NULL
,则该消息只有一个接收者。
答案 2 :(得分:0)
由于clasue:
,您缺少有关该邮件的其他接收者的信息AND
receiver_id = y
这会将结果集限制为仅接收方y
。删除该条款,你将得到它们。但是,您可能会在sender_id = x
处发送每条消息,因此您需要通过指定message_id
来限制查询。
所以你的最终查询应该是这样的:
SELECT
*
FROM
messages
JOIN message_receivers ON messages.id = message_receivers.message_id
WHERE
sender_id = x
AND
message_id = y
答案 3 :(得分:0)
您不需要将结果限制为receiver_id = y,对吗? 您也可以用不同的方式编写语句,并轻松返回接收者ID:
SELECT m.*, r.receiver_id
FROM messages m, message_receivers r
WHERE m.id = r.message_id
AND m.sender_id = x