2013-10-11 29 views
0

環境PHP 5.3.5 phpMyAdmin的3.3.9查詢顯示只有每個線程的最新消息

Here's an link of the issue in sqlfiddle

力圖打造,它通過用戶的留言活動過濾器的查詢。該活動將根據最近添加的消息顯示最新的線程。所以我必須考慮用戶是收件人還是發件人。

我有一個查詢結構,但我很難分組的線程。當我將這些線程分組時,最近活動的順序會丟失。

以下是查詢和結果,它捕獲最後10條消息的正確順序,但存在重複的thread_ids。我只想根據消息發送日期顯示最近的線程。

SQL查詢:

SELECT m.date_sent, m.thread_id, m.message_id, m.sender_id, 
    upub2.firstname as sender_name, mr.recipient_id, 
    upub1.firstname as recipient_name 
FROM message AS m 
    JOIN message_recipient AS mr ON mr.message_id = m.message_id 
    JOIN user_public_info AS upub1 ON upub1.user_public_info_id = mr.recipient_id 
    join user_public_info AS upub2 ON upub2.user_public_info_id = m.sender_id 
WHERE ((m.senderDelete IS NULL OR m.senderDelete = 0) AND m.sender_id = 2) OR 
    ((mr.is_delete IS NULL OR mr.is_delete = 0) AND mr.recipient_id = 2) 
ORDER BY m.message_id; 

結果:

date_sent   thread_id message_id sender_id sender_name  recipient_id recipient_name 
2013-10-09 14:31:50  106   113    1    John    2   Mark 
2013-10-09 14:30:50  107   112    2   Mark    1   John 
2013-10-09 14:30:31  106   111    2   Mark    1   John 
2013-10-09 09:49:58  112   110    1   John    2   Mark 
2013-10-09 09:20:24  108   106    1   John    2   Mark 
2013-10-07 15:46:15  107   105    1   John    2   Mark 
2013-10-07 14:40:25  103   104    1   John    2   Mark 
2013-10-07 14:39:37  103   103    1   John    2   Mark 
2013-10-07 14:36:34  107   102    2   Mark    1   John 
2013-10-07 14:36:07  106   101    2   Mark    1   John 
2013-10-07 14:35:29  105   100    2   Mark    1   John 
2013-10-07 12:32:50  104   99   2   Mark    1   John 
2013-10-07 12:15:43  104   98   2   Mark    1   John 
2013-10-07 11:46:36  104   97   2  Mark    1   John 
2013-10-07 11:43:32  104   96   1   John    2   Mark 
2013-10-07 11:43:17  104   95   1   John    2   Mark 
2013-10-07 11:27:14  103   94   1   John    2   Mark 

我想是這樣的:

date_sent   thread_id message_id sender_id sender_name  recipient_id recipient_name 
2013-10-09 14:31:50  106   113    1  John    2   Mark 
2013-10-09 14:30:50  107   112    2   Mark    1   John 
2013-10-09 09:49:58  112   110    1   John    2   Mark 
2013-10-09 09:20:24  108   106    1   John    2   Mark 
2013-10-07 14:40:25  103   104    1   John    2   Mark 
2013-10-07 14:35:29  105   100    2   Mark    1   John 
2013-10-07 12:32:50  104   99   2   Mark    1   John 

可這在一個單一的查詢來完成,或者我應該創建另一個查詢基於第一個查詢的結果?

謝謝你的人,可以幫助我解決這個查詢....

+1

有關獲得'Y'的'Top N''X'的問題是關於SO的最常見問題之一。也許你的搜索過於具體。 – GolezTrol

+0

現在看着這個sqlfiddle。希望我能儘快爲您安排一些東西:) – mcv

+0

@Strawberry鏈接已在帖子中提供。確切的數據庫結構並不完全正確,因爲sqlfiddle聲明只允許有一個主鍵。 – mcv

回答

1

你的各種數據集,查詢和結果不會出現彼此所以這是一個有點難以遵循correspod,但我懷疑你是沿着這些路線......

SELECT m.message_id m_id 
     , m.sender_id s_id 
     , m.thread_id t_id 
     , m.subject 
     , m.message 
     , m.date_sent 
     , s.firstname sender 
     , r.firstname recipient 
    FROM message m 
    JOIN message_recipient n 
    ON n.message_id = m.message_id 
    JOIN user_public_info s 
    ON s.user_public_info_id = m.sender_id 
    JOIN user_public_info r 
    ON r.user_public_info_id = n.recipient_id 
    JOIN (SELECT thread_id, MAX(max_message_id) max_message_id FROM message GROUP BY thread_id)x 
    ON x.thread_id = m.thread_id AND x.max_message_id = m.message_id; 
+0

謝謝。我從來沒有問過這樣的問題,所以我重新寫了我的初始帖子,刪除細節。我還把我想要的結果放在了什麼樣的位置。請看看,希望它更清晰。謝謝:) – mcv

+0

如果僅查看用戶1的活動,那是John。我只想要活動的線程消息。 看起來像這樣: | 17 | 1 | 6 |主題6 |消息6 | 2013-10-10 14:31:50 |約翰|簡| | 16 | 2 | 1 |主題1 |消息1 | 2013-10-09 14:31:50 |簡|約翰| | 12 | 2 | 3 |主題3 |消息3 | 2013-10-07 14:31:50 |簡|約翰| | 13 | 2 | 4 |主題4 |消息4 | 2013-10-07 14:31:50 |簡|約翰| | 7 | 2 | 2 |主題2 |消息2 | 2013-10-02 14:31:50 |簡|約翰| – mcv

+0

對於糟糕的格式感到抱歉。 – mcv

相關問題