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

时间:2012-06-19 05:42:52

标签: 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之间的通信我需要为每个其他用户指定的用户使用最新的一个。

谢谢,

6 个答案:

答案 0 :(得分: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)

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

答案 1 :(得分:0)

尝试将消息作为主键,并将发件人和接收者放在2个单独的表中,以获取相同的消息,如下所示:

Table 1: {message, sender, sendtime}
Table 2: {message, receiver, sendtime}

答案 2 :(得分:0)

试试这个:

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

    )

答案 3 :(得分:0)

对我而言,使用基于发送方和接收方的自己的ID感觉更简单。不需要JOIN,只需要一个GROUP BY

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

答案 4 :(得分:0)

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

SELECT DISTINCT sent_by FROM messages WHERE sent_to = 1 UNION SELECT DISTINCT sent_to FROM messages WHERE sent_by = 1

答案 5 :(得分:-1)

这将解决问题

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