我有一个简单的表来维护用户之间的消息.表结构看起来像
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)