2011-04-26 23 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