在mysql中选择两个用户之间的最新消息

Ujj*_*ati 5 mysql

我有一个简单的表来维护用户之间的消息.表结构看起来像

     sender    receiver   message   sendtime
      1          2          m1      2012-01-01 12:12:12  
      2          1          m2      2012-01-01 12:50:20
      1          2          m3      2012-01-01 12:55:55
      1          3          m4      2012-01-02 05:05:05
      1          4          m5      2012-01-05 05:20:20
      4          1          m6      2012-01-06 06:05:00
      4          1          m7      2012-01-07 11:11:11
      2          4          m8      2012-01-08 05:01:01
Run Code Online (Sandbox Code Playgroud)

现在,对于ID为1的用户,我需要这样的结果

    sender     receiver   message   sendtime
     1           2          m3      2012-01-01 12:55:55
     1           3          m4      2012-01-02 05:05:05
     4           1          m7      2012-01-07 11:11:11
Run Code Online (Sandbox Code Playgroud)

这就是我需要特定用户的最新消息,无论他是发送者还是接收者.

虽然看起来很简单,但我找不到编写单个mysql查询的方法.

另外,我想建议如果对于这种解决方案,我的桌面设计很差.

注意:我认为应该提到的一件事是,例如用户1和用户2之间存在多个通信.我需要它们之间的最新通信,无论用户1是发送者还是接收者,只需要最近的.

大多数用户建议查询,这将带来一个记录与发送者1,接收者2,然后发送者2,接收者1.我不需要这两个记录,因为这是同一用户1和用户2之间的通信.我需要一个是为每个其他用户指定的用户的最新一个.

谢谢,

vea*_*top 11

SELECT data.* FROM 
(SELECT MAX(sendtime) AS sendtime 
         FROM data 
         WHERE 1 IN (sender,receiver)
         GROUP BY IF (1 = sender,receiver,sender)) AS latest
LEFT JOIN data ON latest.sendtime = data.sendtime AND 1 IN (data.sender, data.receiver)
GROUP BY IF (1 = data.sender,data.receiver,data.sender)
Run Code Online (Sandbox Code Playgroud)

我建议在表中使用唯一的序列ID以避免外部GROUP BY.如果你有增量唯一message_id(即更大的message_id对应于以后sendtime),查询将更简单:

SELECT data.* FROM 
(SELECT MAX(message_id) AS message_id 
         FROM data 
         WHERE 1 IN (sender,receiver)
         GROUP BY IF (1 = sender,receiver,sender)) AS latest
LEFT JOIN data USING(message_id)
Run Code Online (Sandbox Code Playgroud)