2013-07-22 20 views
2

我有一個表「消息」是 你可以看到下面的圖片2個IDS之間的連接: table messages查詢來獲取獨特的(最後在時間軸)在表

從該表我的ID作爲用戶2有時我是發件人,有時候我是收件人。

我需要返回只有最後一條消息查詢我從每個用戶交換。不管我是否寄出,或者我收到了。 我不確定我是否應該在這裏使用截然不同的。我真的不知道如何使用它。

能夠更理解的,在例如上表中應返回:

行與ID = 4(最後一個消息,我與用戶4)
行使用id = 6(最後一條消息我與用戶1)
行使用id = 7(最後的消息,我與用戶3)
行與ID = 5(最後的消息,我與用戶7)
行使用id = 19(最後的消息我與用戶15)

+0

你能提供數據的錶轉儲或sqlfiddle? – Lee

回答

0
SELECT * FROM messages 
JOIN (
    SELECT MAX(id) AS id 
    FROM messages 
    WHERE 2 IN (receiver_id, sender_id) -- useless if the table really only contains messages between you and another person 
    GROUP BY IF(receiver_id = 2, sender_id, receiver_id) -- GROUP BY either sender_id or receiver_id, depending on which end of the exchange you are (will perform very poorly) 
) AS last_message USING (id) 

繼knittl的評論,在上述假設的單調遞增id(諸如auto_increment列)。如果不是的話,那麼你就不得不求助於醜如這樣的:

SELECT * FROM messages 
JOIN (
    SELECT MAX(datetime) AS datetime, IF(receiver_id = 2, sender_id, receiver_id) AS other_id 
    FROM messages 
    WHERE 2 IN (receiver_id, sender_id) 
    GROUP BY other_id 
) AS last_message ON 
    last_message.datetime = messages.datetime 
    AND last_message.other_id = IF(receiver_id = 2, sender_id, receiver_id) -- this line is superfluous if only one message may be sent or received within one given second 
+1

謝謝!我做了一個小的變化: SELECT * FROM消息中號 JOIN ( SELECT MAX(ID)ID 從郵件中 WHERE 2 IN(receiver_id,SENDER_ID) - 無用的,如果表真的只包含你和另一個人之間的消息 GROUP BY IF(receiver_id = 2,sender_id,receiver_id) - GROUP BY可以是sender_id或receiver_id,具體取決於您所在的交換端(將執行得非常差) ) AS last_id on m.id = last_id。 ID – Konstantinos

+0

謝謝你發現錯誤,我糾正了我的帖子。 – RandomSeed

+1

選擇最大ID將僅適用於ID隨着時間增加(很可能他們會,但無論如何都知道) – knittl

0

您可以嘗試:

<!-- language: lang-sql --> 
SELECT * FROM messages WHERE sender_id = 2 OR receiver_id = 2 ORDER BY Id DESC LIMIT 1 
0

以下應該做你想要什麼:

SELECT messages.* 
FROM (
    SELECT receiver_id, sender_id, MAX(datetime) maxtime 
    FROM messages 
    WHERE receiver_id = 2 
    OR sender_id = 2 
    GROUP BY receiver_id, sender_id 
) latest 
LEFT JOIN messages 
ON latest.receiver_id = messages.receiver_id 
AND latest.sender_id = messages.sender_id 
AND latest.maxtime = messages.datetime 

demo

+0

如果你有兩個消息在同一時間(取決於你的日期時間列的分辨率),你會得到這兩個消息。 – knittl