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

标签 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

现在,对于 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

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

虽然这看起来很容易,但我找不到编写单个 mysql 查询的方法。

此外,如果对于这种解决方案,我的表格设计很差,我想提出建议。

注意:有一件事,我想我应该提到的是,例如用户 1 和用户 2 之间有多次通信。我需要他们两个之间的最新通信,无论用户 1 是发送者还是接收者,只有最近的。

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

谢谢,

最佳答案

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)

我建议在您的表中使用唯一序列 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)

关于mysql - 在mysql中选择两个用户通信之间的最新消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11095024/

相关文章:

当 LIKE 返回正确数量的结果时,Mysql MATCH 返回 0?

php - 如何更改数据库的架构以引入新功能或更改当前功能

php - Laravel 数据库多对多(Mysql)或将 Json 保存在表中

mysql - 子查询还是加入?

mysql - 如何在Ubuntu上的mysql中运行sql脚本?

mysql - 计算温度连续低于 0 的天数

Mysql查询三张表,其中第三张表有多个查询返回

c# - 你能找到我的 SQL 语法中的错误吗?

MYSQL 3 表查询;对表 A 中的每个项求和表 B(如果找到);使用表 C(如果找到)对结果进行排序

mysql - 交互式 ssh 和 mysql 命令的 Bash 脚本