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

选择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

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

     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之间的通信。我需要一个与其他每个用户一起指定的用户的最新版本

谢谢,

这会解决的

$query = "SELECT * FROM tableName WHERE `sender`='$userNumber' OR `receiver`='$userNumber' ORDER BY `sendtime` DESC LIMIT 0,1";

尝试将消息设为主键,并将发送者和接收者放在两个单独的表中,以获得相同的消息,如下所示:

Table 1: {message, sender, sendtime}
Table 2: {message, receiver, sendtime}
试试这个:

SELECT  Distinct (*)
FROM    tableName   m
WHERE   date =
    (
    SELECT  MAX (date)
    FROM    tableName

    )
我建议在表中使用唯一的序列id,以避免外部分组。 如果您有递增的唯一消息id,即更大的消息id对应于更晚的发送时间,则查询会简单得多:

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)

对我来说,根据发送者和接收者使用自己的ID感觉更简单。无需加入,只需一个群组:


我花了30分钟找到这个问题的解决方案,因为我有同样的问题 简单一点


不选择*发件人=1 | |收件人=1订单按发送时间描述限制3;工作?否,该查询将给出两次用户1和2之间的消息结果。我的意思是,我需要用户之间的唯一最新消息。我想你可以使用DISTINCT then:选择DISTINCT*发件人=1 | |收件人=1按发送时间顺序描述限制3请具体说明,我想在我的问题中显示的输出,我想要的输出。此查询也不适合我的场景如果我们将消息作为主键,我们如何在用户之间维护相同的消息。主键也应该是唯一的。但是消息不能是唯一的,我们也不能添加任何其他键组合来使其唯一,不是吗?它将只提取最大值为date的记录。而且,它也不适合我的场景。从这个查询中,我也得到了user1是user 2的发送者和接收者的记录,因此在与user 2通信时,user 1有两条记录。我们能从与用户2的通信中只得到一条最新记录吗,无论用户1是发送者还是接收者?哦,我没有注意到用户的附加过滤器。我已经编辑了答案。我们是否可以从与用户2的通信中获得一条最新记录,无论用户1是发送者还是接收者?这个解决方案似乎非常接近,只是有一些不起作用的东西。它不显示1和4之间通信的记录。该记录显示为所有空值。有什么解决方案吗?目前,我认为我无法在一个查询中实现这一点!!但你真的救了我一天。谢谢,@vearutop。解决方案很好!
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)
SELECT sender, receiver, message, MAX(time)
FROM (
  SELECT *,
    CASE WHEN sender < receiver 
              THEN CONCAT(sender,'&', receiver)
              ELSE CONCAT(receiver,'&', sender) END AS fromto
  FROM data) AS a
GROUP BY fromto
SELECT DISTINCT sent_by FROM messages WHERE sent_to = 1 UNION SELECT DISTINCT sent_to FROM messages WHERE sent_by = 1