如何从mySQL中的每个对话中获取最后一条消息?

问题描述:

我在寻找什么:
我在寻找一个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 ----------...---------------- -...

要从对话中获取最后一条消息,可以使用通过查询的组来获取最后一个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

再次感谢!你帮了我很多。 –