MySQL选择不同用户的最新传入或传出消息

MySQL选择不同用户的最新传入或传出消息,mysql,Mysql,我有一个表结构,我保存了发送和接收的消息的记录,如下所示 member_id1是发送方,member_id2是接收方 现在,我试图实现的是获取包含成员id为3的用户的最新消息的行。结果应仅包含消息id为2和4的2行,因为2是成员id为3的用户与成员id为2的用户之间的最后一条消息,4是成员id为3的用户与成员id为1的用户之间的唯一消息 结果不应包含消息\u id为3的行,因为它与成员\u id为3且消息\u id为1的用户无关,因为消息\u id为2的消息对其进行了过度处理 希望我已经向能帮

我有一个表结构,我保存了发送和接收的消息的记录,如下所示

member_id1是发送方,member_id2是接收方

现在,我试图实现的是获取包含成员id为3的用户的最新消息的行。结果应仅包含消息id为2和4的2行,因为2是成员id为3的用户与成员id为2的用户之间的最后一条消息,4是成员id为3的用户与成员id为1的用户之间的唯一消息

结果不应包含消息\u id为3的行,因为它与成员\u id为3且消息\u id为1的用户无关,因为消息\u id为2的消息对其进行了过度处理


希望我已经向能帮助我解决这个问题的人明确了我的问题。

这个问题有点模糊,但据我所知,你在找这个吗

 SELECT * FROM table_name WHERE member_id2 = 3 ORDER BY senddate DESC;

你可以用UNION把它们结合起来

 (SELECT * FROM table_name WHERE member_id2 = 3  ORDER BY senddate DESC limit 1)
union 
 (SELECT * FROM table_name WHERE member_id1 = 3  ORDER BY senddate DESC limit 1)
或者,如果需要获取每个成员的最新发送/接收信息,则可以加入一个查询,以获取每个成员的最大发送日期:

select * from table_name t1 inner join 
(
 select member_id1, null as member_id2, max(senddate) as senddate 
 from table_name group by member_id1
 UNION
 select null as member_id1, member_id2, max(senddate) as senddate 
 from table_name group by member_id2
) r ON (t1.member_id1 = r.member_id1 OR t1.member_id2 = r.member_id2) 
AND t1.senddate = r.senddate 

我想我已经为自己的问题找到了正确的答案。虽然我不太确定,但似乎效果很好。对于那些需要解决此类问题的人;尝试一下:

SELECT m1.* 
  FROM table_name m1 
  INNER JOIN (SELECT MAX(senddate) AS senddate, 
                     IF(member_id2 = 3, member_id1, member_id2 ) AS user 
                FROM table_name 
               WHERE (member_id1 = 3 AND delete1=0) OR 
                     (member_id2 = 3 AND delete2=0) 
              GROUP BY user) m2 
         ON m1.senddate = m2.senddate AND 
           (m1.member_id1 = m2.user OR m1.member_id2 = m2.user) 
     WHERE (member_id1 = 3 AND delete1=0) OR 
           (member_id2 = 3 AND delete2=0) 
   ORDER BY m1.senddate DESC

嗨,巴勃罗,其实没那么容易。因为用户既可以是发送方也可以是接收方,这意味着查询不仅应该查看列member_id2,还应该查看member_id1。在这种情况下,请从表_name中选择*,其中member_id2=3或member_id1=3 ORDER BY senddate DESC;但这将得到所有包含member_id 3的行。我们不希望查询得到过多的行,我们只希望每个收件人都有最近的行。哦,那么我必须说,从文本中很难理解,但祝贺你修复了它!嗨,帕特里克64。。您的查询分别返回消息ID4,1,2,3,2,1。正如您所看到的,它不仅得到了不应该得到的,而且还复制了应该得到的。那么第一个查询呢?这就是我希望能回答你问题的答案。我提供第二个查询只是为了说明如何获取所有成员的所有最新发送/接收消息,因此我希望它返回重复的消息。第一个查询仅返回2个结果,因为它是有限的,并且结果是用户发送和接收的最后一条消息,成员id为3。我们想要实现的是获得用户发送和接收的一整套“最后”消息,成员id为3,发送给/从与用户有消息历史记录的任何成员。