2011-04-26 82 views
0

我正在写一个PHP/MySQL的基本消息脚本,但我现在被困在一个数据库查询中。我会感激任何提示或帮助(:需要一些支持来编写一个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

请说明您的意思是“缺少其他消息接收者的信息”。你在寻找一个能够返回两个用户之间对话的查询吗?很难看到你确切需要什么。 – Mikecito 2011-04-26 06:41:06

+0

是的,我正在寻找一个查询来获取两个用户之间的整个对话(并且上面的JOIN-Statement已经这样做了)。但查询的结果不会告诉我该对话中的消息是否也有其他接收者! – 2011-04-26 07:05:54

回答

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,那么该消息只有一个接收者。

+0

非常感谢您的查询及其描述!正是我一直在寻找的! – 2011-04-27 10:12:56

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 
+0

如果我在where子句中指定了某个message_id,我不会理解整个对话): – 2011-04-26 07:08:45

+0

@ d.hill啊,我没有意识到对话可以由多条消息组成。在这里使用两个查询可能会更好,因为您试图找到两组信息。尝试使用一个查询来获得对话,另一个查询接收者。 – 2011-04-26 07:11:29

+0

是的,但我可以写入多个选择一个查询?我对此毫无经验。为每个消息编写一个查询来检查是否有其他接收者会很容易,但方式太多。 – 2011-04-26 07:16:32

1

如果你想看到一个消息的所有接收者然后删除了条款的第二部分:在同一时间

AND receiver_id = y 

你将要指定MESSAGE_ID,因为这将是混乱在前端的用户

AND message_id = z 
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