需要一些支持编写MySQL-Query

时间:2011-04-26 06:34:32

标签: mysql database select relational

我正在用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

但现在我错过了其他信息接收者的信息!我不知道如何获取这些信息。有什么想法吗? (:

4 个答案:

答案 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列中(每个结果记录一个)。如果carboncopyNULL,则该消息只有一个接收者。

答案 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