2012-06-06 91 views
3

對話包含消息,一條消息可以發送給2個或更多用戶。MYSQL - 獲取用戶的最後消息MAX(時間)

目標是通過用戶每個對話來檢索過去的消息,因此其中每個會話的信息是最新的。

另外message_user.time是當用戶已經讀取消息,所以當它等於0這意味着消息還沒有被讀取,所以它會更好,如果第一個訂單將是message_user時間等於0和message.time是最大的數字。

我得到了這些表

消息用戶

user message  time 
-----|------------|------- 
7 | 1   | 0 
8 | 1   | 0 
7 | 2   | 300 
8 | 2   | 300 
7 | 3   | 400 

消息

id text   conversation time 
---|-------------|--------------|---------- 
1 | blah blah1 | 1   | 200 
2 | blah blah2 | 1   | 300 
3 | blah blah3 | 2   | 400 
4 | blah blah4 | 2   | 500 

的目標是小組交談的消息,然後獲得鏈接到最後message_user首先有較大時間戳的對話。

我想這是什麼,但我沒有得到最後消息(順序錯誤)

SELECT m.user, mu.message, mu.time, mu.id, m.text, m.time as message_time, m.conversation 
    FROM message_user as mu,message as m 
    WHERE mu.message=m.id AND mu.user=8 
    GROUP BY m.conversation 
    ORDER BY m.time DESC'; 

那麼下一步將是: 我不知道這是否是可能的,但是,如果可以輸出message_user,其中時間等於0第一次,然後第二次是message.time(我甚至不知道在一個請求中是否可能完美!)

對於用戶8輸出應該是這樣的:

text  conversation 
-----------|------------ 
blah blah1 | 1   //because message_user.time = 0 (means message is unread) 
blah blah3 | 2   //because message.time is the highest in the conversation 

謝謝!

+0

這是一個奇怪的看着時間.... – Flukey

+0

是它爲例子) –

+0

可不可以給有關表結構的一些解釋嗎?我的意思是,如果每封郵件只有一個發件人並且只有一個收件人,那麼郵件用戶表的目標是什麼? 「對話」究竟是什麼? – raina77ow

回答

4

首先,我建議您重組表使它更容易些,但這裏是我認爲你所要求的......每個會話,只顯示最後創建的變換消息,隨着最後時間和用戶誰閱讀(但更喜歡未讀這個)。

SELECT m.user as User_Sent, m.conversation, m.text, m.time as Time_Sent 
, mu.id, mu.user as User_Read, mu.time as Time_Read 
FROM message as m 
JOIN (
    SELECT mx.conversation, MAX(mx.time) as MaxTime 
    FROM message as mx GROUP BY mx.conversation 
) as mx 
On m.conversation = mx.conversation 
And m.time = mx.MaxTime 
JOIN (
    SELECT mu.message, MAX(mu.time) as MaxTime, MIN(mu.time) as MinTime 
    From message_user as mu 
    GROUP BY mu.message 
) as mux 
On m.id = mux.message 
JOIN message_user as mu 
ON m.id = mu.message 
AND CASE WHEN mux.MinTime = 0 THEN mux.MinTime ELSE mux.MaxTime END = mu.time 
+0

謝謝你只是錯過了一個「,」在第一行,我得到這個錯誤:「未知的列'mu.MinTime'在'條款''的方式如果你有任何想法,我可以改善結構,請讓我知道;) –

+0

添加了逗號。謝謝。 – VenerableAgents

+0

我建議解決這個問題的方法是讓你的標識符(m.id和mu.message)是相同的名字(比如messageId)。接下來,你應該添加一個布爾字段到mu,當它被讀取時標記爲true。 – VenerableAgents

相關問題