2013-10-29 69 views
1

我有3個表消息,消息用戶和用戶。彙總連接表的最大元素

我想提取一個用戶收到最後一條消息的對話列表,我也想訪問這條消息的數據。 會話列表的順序應該是包含最先收到的最後一個消息的順序。 (談話只是message.conversation一個id)

我得到的東西差不多的工作是這樣的:

SELECT mu.* 
    , m.id message_id 
    , m.conversation message_conversation 
    , m.from message_from 
    , m.text message_text 
    , m.date_created message_date_created 
    , user1.type user1_type 
    , user1.name user1_name 
    , user1.email user1_email 
    , user1.avatar_blob_key user1_avatar_blob_key 
    FROM message_user mu 
    LEFT 
    JOIN message m 
    ON m.id = mu.message 
    LEFT 
    JOIN user user1 
    ON user1.id = m.from 
WHERE mu.to = THE_USER_ID 
GROUP 
    BY m.conversation 
ORDER 
    BY mu.message DESC; 

但這個查詢沒有得到最後接收到的消息,但第一個在每一個對話,而不是:/

看起來這個部分ORDER BY message_user.message DESC沒有被查詢使用。

+1

這是一個標準的GROUPWISE MAX問題。之前回答了很多次。 – Strawberry

+0

我想是這樣,但我不知道我的查詢中出了什麼問題......你能指出我的方向嗎? –

+0

在沒有任何聚合函數的情況下,使用GROUP BY子句總是不合適的。 – Strawberry

回答

2

因此,爲了重申您的請求,應該返回的消息行應該是給定對話中的最後一條消息是一個有問題的用戶。假設是正確的,你可以嘗試像以下:

Select MU.* 
    , M.id As message_id 
    , M.conversation As message_conversation 
    , M.from As message_from 
    , M.text As message_text 
    , M.date_created As message_date_created 
    , FromUser.type As user1_type 
    , FromUser.name As user1_name 
    , FromUser.email As user1_email 
    , FromUser.avatar_blob_key As user1_avatar_blob_key 
From message_user As MU 
    Left Join message As M 
     On M.id = MU.message 
      And M.date_created = (
            Select Max(M1.date_created) 
            From message As M1 
            Where M1.conversation = M.conversation 
            ) 
    Left Join user As FromUser 
     On FromUser.id = M.from 
Where MU.to = <some user id> 
Group By M.conversation 
Order By MU.message Desc; 
+0

您好托馬斯是這是正確的,只是在您的查詢中的一個問題而M.to = MU.to:message.to不存在僅message.from –

+0

message_user和消息通過消息id鏈接:message.id = message_user .message only –

+1

@JeromeAnsia - 一些實際的模式在這裏很有用。我刪除了'M.to = MU.to'上的過濾器,我不相信它會實質性地改變查詢的結果。 – Thomas

3
SELECT mu.* 
    , message.id message_id 
    , message.conversation message_conversation 
    , message.from message_from 
    , message.text message_text 
    , message.date_created message_date_created 
    , user1.type user1_type 
    , user1.name user1_name 
    , user1.email user1_email 
    , user1.avatar_blob_key user1_avatar_blob_key 
    FROM message_user mu 
    LEFT 
    JOIN (select max(id) id,`from` 
     from message 
     group by `from`)max 
    ON max.id = mu.message 
    LEFT 
    JOIN user user1 
    ON user1.id = message.from 
WHERE mu.to = THE_USER_ID 
GROUP 
    BY message.conversation 
ORDER 
    BY mu.message DESC; 
+0

只是頭暈目眩的第一次嘗試,小提琴會幫助我。 – Mihai

+0

感謝Mihai它在第二行中斷,m.id是一個未知列 –