Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从mySQL中的每次对话中获取最后一条消息?_Mysql - Fatal编程技术网

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

如何从mySQL中的每次对话中获取最后一条消息?,mysql,Mysql,我在寻找什么: 我正在寻找一个SELECT查询,它允许我从每个对话中选择最后一条消息。对话由双方具有相同用户ID的所有行组成。示例:4-2和2-4 消息表: ID------发送方ID------接收方ID------正文------时间戳 1------------------4------------------2------------------2------------------2------------------4--------------------3------------

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

消息表:
ID------发送方ID------接收方ID------正文------时间戳
1------------------4------------------2------------------2------------------2------------------4--------------------3------------------4------------------2--------------------4--------4------------------2--------------------5--------4---------------------3--------------------------------------------------
6--------------------3--------------------4------------------------------

结果:
ID------发送方ID------接收方ID------正文------时间戳

4------------------4------------------2----------------------------------------…
6------------------3------------------4------------------------------…

要从对话中获取最后一条消息,您可以使用group by查询来获取最后一个ID(如果它总是递增)或最后一个时间戳。用户_1是会话中id较低的用户,用户_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

一个小问题,我可以用这个来获得相同的结果,但选择一个ID吗?假设我想得到用户3的最后消息,应该只有一个结果,用户2也是如此。但是,用户4应该有2个结果。是的,您可以在第一个或第二个查询中添加此条件。。。首先是
。。。从发送者\u id=3或接收者\u id=3的消息按…
或更短的
分组。。。从消息中,3在(发送者id、接收者id)组中由…
再次感谢!你帮了我很多。