2017-04-07 36 views
2

我在尋找什麼:
我在尋找一個SELECT查詢,允許我從每個對話中選擇最後一條消息。對話由兩側具有相同用戶ID的所有行組成。 示例:4-2 & 2-4。如何從mySQL中的每個對話中獲取最後一條消息?

信息表:
ID ----- SENDER_ID ----- Receiver_ID ----- ----- 時間戳
1 ------------------- 4 --------------------- 2 -------- --... ----------------- ...
2 ------------------- 2 --- ------------------ 4 ----------...-----------------。 ..
3 ------------------- 4 --------------------- 2 ---- ------...-----------------。 ..
4 ------------------- 4 --------------------- 2 ---- ------... ----------------- ...
5 ------------------- 4 --------------------- 3 ----------...-------------- --- ...
6 ------------------- 3 --------------------- 4 ----------... ----------------- ...

結果:
ID --- - SENDER_ID ----- Receiver_ID ----- ----- 時間戳
4 ------------------- 4 --------------------- 2 -------- ----... ----------------- ...
6 ------------------- 3- -------------------- 4 ----------...---------------- -...

回答

3

要從對話中獲取最後一條消息,可以使用通過查詢的組來獲取最後一個ID(如果它始終遞增)或最後一個時間戳。 USER_1將與較低的ID的用戶,並user_2與對話的高ID用戶:

select 
    least(sender_ID, receiver_ID) as user_1, 
    greatest(sender_ID, receiver_ID) as user_2, 
    max(ID) as last_id, 
    max(timestamp) as last_timestamp 
from 
    messages 
group by 
    least(sender_ID, receiver_ID), 
    greatest(sender_ID, receiver_ID) 

你就可以得到實際的消息,這樣的查詢:

select m.* 
from 
    messages m inner join (
    select 
     least(sender_ID, receiver_ID) as user_1, 
     greatest(sender_ID, receiver_ID) as user_2, 
     max(ID) as last_id, 
     max(timestamp) as last_timestamp 
    from 
     messages 
    group by 
     least(sender_ID, receiver_ID), 
     greatest(sender_ID, receiver_ID) 
) s on least(sender_id, receiver_id)=user_1 
     and greatest(sender_id, receiver_id)=user_2 
     and m.id = s.last_id -- or last timestamp 
+0

一小問題,我可以使用它來獲得相同的結果,但選擇一個ID?假設我想獲取用戶3的最後一條消息,應該只有1個結果,對於用戶2是相同的。但用戶4應該有2個結果。 –

+0

是的,你可以在第一個或第二個查詢上添加這個條件......首先它是'...來自其中sender_id = 3或receiver_id = 3 group by ...'或更短的消息......來自3(in sender_id,receiver_id)組中的消息...' – fthiella

+0

再次感謝!你幫了我很多。 –

相關問題