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

时间:2017-04-07 21:24:10

标签: mysql

我在寻找什么:
我正在寻找一个SELECT查询,允许我从每个对话中选择最后一条消息。对话由两侧具有相同用户ID的所有行组成。 示例:4-2& 2-4。

消息表:
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 ----------...-------------- ---...

1 个答案:

答案 0 :(得分:6)

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