2012-09-30 145 views
2

我正在嘗試構建一個內部郵件系統,用戶可以向一個或多個用戶發送/回覆郵件。我希望顯示收件箱像Gmail系統。原始消息將在表中列出。如果有與該消息相對應的答覆,答覆計數顯示在旁邊。如果消息或回覆中的任何一個未讀,我想要以粗體顯示。我有以下表結構。郵件系統查詢不起作用

msg_inbox表

message_id 
message_subject 
message_body 
sender_id 
recipient_id 
read_status 
message_date 
marked_important 

msg_reply表

reply_id 
message_id 
reply_subject 
reply_body 
reply_sender_id 
reply_recipient_id 
reply_read_status 
reply_date 

到目前爲止我下面的查詢,但似乎並沒有工作

SELECT 
    m.*, 
    COUNT(r.reply_id) replycount, 
    (SELECT 
    reply_read_status 
    FROM 
    sc_messages_reply 
    WHERE message_id = r.message_id 
    AND reply_recipient_id = r.reply_recipient_id 
    AND reply_read_status='0' 
) AS reply_read_status, 
    r.reply_sender_id, 
    r.reply_date 
FROM 
    sc_messages m 
    LEFT OUTER JOIN sc_messages_reply r 
    ON m.message_id = r.message_id 
WHERE m.sender_id = '34' 
    OR m.recipient_id = '34' 
    OR r.reply_sender_id = '34' 
    OR r.reply_recipient_id = '34' 
GROUP BY m.message_id 
ORDER BY m.marked_important DESC, 
    m.message_date DESC, 
    r.reply_date DESC 

我一定是什麼地方了在上面的查詢中是錯誤的,如果有人指出它會很好。

這裏是樣本數據

msg_inbox

insert into `msg_inbox` 
(`message_id`, `message_subject`, `message_body`, `sender_id`, 
`recipient_id`, `read_status`, `message_date`, `marked_important`) 
values (1, 'This is test message', 
     'This is test message body apart from subject', 
     12, 34, 1, '2012-09-29 07:49:37', 1), 
     (2, 'This is yet another message', 
     'This is yet another subject', 13, 34, 1, '2012-09-29 07:51:00', 0); 

msg_reply

insert into `msg_reply` 
(`reply_id`, `message_id`, `reply_subject`, `reply_body`, `reply_sender_id`, 
`reply_recipient_id`, `reply_read_status`, `reply_date`) 
values (1, 2, 'Test reply', 'test body\r\n', 
     34, 13, 1, '2012-09-29 07:51:46'),   
     (2, 2, 'Reply of the reply\r\n', 'Message reply of the reply', 
     13, 34, 1, '2012-09-29 07:52:32'), 
     (4, 1, 'Re.This is test message', 
     'Naturally I took it upon myself to solve this problem for all of you :) I created this plugin to be as general purpose as possible. As a result it ended up being vastly more customizable than any other jQuery auto-complete plugin. Not only that, I am using actual jQuery. For some reason all the other "jQuery" plugins don't really take advantage of the radness that is jQuery. Consequently, my plugin ended up being',34,12,1,'2012-09-30 14:37:40'),(5,1,'Re.This is test message','Well its all good sir',12,34,0,'2012-09-30 15:07:38'); 
+0

@MahmoudGamal,如預期 – WatsMyName

+0

那好吧查詢不顯示結果,您能添加一些樣本數據和預期的結果。 –

+0

@MahmoudGamal,唯一不工作的部分似乎是子查詢,可以說'message_id = 1',原來的消息被讀取所以'read_status = 1'這沒問題,但是對這個消息ID的回覆之一是我未讀,子查詢是我用於這一點,即返回null值,而不是0,即使有'message_id = 1'的未讀消息答覆 – WatsMyName

回答

1

我認爲你必須JOIN

SELECT 
    m.*, 
    COUNT(r.reply_id) replycount, unreaded.reply_read_status, 
    r.reply_sender_id, 
    r.reply_date 
FROM sc_messages m 
INNER JOIN 
(
    SELECT * 
    FROM sc_messages_reply 
    WHERE reply_read_status = '0' 
) unreaded ON m.message_id = unreaded.message_id 
INNER JOIN -- You can also join the readed messages like this: 
(
    SELECT * 
    FROM sc_messages_reply 
    WHERE reply_read_status = '1' 
) readed ---- 
LEFT OUTER JOIN sc_messages_reply r ON m.message_id = r.message_id 
    AND unreaded.reply_recipient_id = r.reply_recipient_id 
WHERE m.sender_id = '34' 
    OR m.recipient_id = '34' 
    OR r.reply_sender_id = '34' 
    OR r.reply_recipient_id = '34' 
GROUP BY m.message_id 
ORDER BY m.marked_important DESC, 
    m.message_date DESC, 
    r.reply_date DESC 
+0

其投擲錯誤 – WatsMyName

+0

@LoVeSmItH什麼錯誤?請張貼它。你還可以在[Sqlfiddle](http://www.sqlfiddle.com/)中設置演示。謝謝 –

+0

錯誤是'錯誤代碼:1064 你的SQL語法有錯誤;檢查對應於你的MySQL服務器版本使用附近的正確語法手冊「m.message_id = unreaded.message_id INNER JOIN ( SELECT * FROM SC_」在行12' – WatsMyName

2

我想我已經解決了這個問題,我已經改變了子查詢

SELECT 
    reply_read_status 
    FROM 
    sc_messages_reply 
    WHERE message_id = r.message_id 
    AND reply_read_status='0' AND reply_recipient_id='34'