我有一个简单的表来维护用户之间的消息。表结构类似于
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之间的通信我需要为每个其他用户指定的用户使用最新的一个。
谢谢,
答案 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";