我在mysql中有一个表。哪个结构是:
id sender receiver time message
-------------------------------------------------------
1 23 34 2014-11-02 14:55:02 1
2 22 34 2014-11-02 16:55:02 2
3 21 35 2014-11-02 16:55:02 5
4 23 34 2014-11-02 16:55:02 2
5 22 35 2014-11-02 16:55:02 1
现在我需要进行一个查询,如果通信不止一个,它将从特定发送方获取特定接收方的最新消息。否则,它会给出单行. 在这里,我想使用接收器 id = 34 进行查询,它应该给我第 4 行和第 2 行。即
2 22 34 2014-11-02 16:55:02 2
4 23 34 2014-11-02 16:55:02 2
在这里,我不是从数据库中询问特定数量的行。这是一个对话数据库。我想要用户的对话列表。当同一个发送方和接收方有多行时,我想要最新的对话。
怎么做?
您可以使用分组依据获取最新的消息时间,然后在子查询中使用它来获取所有消息详细信息
Select * from
table1 T
Join(
Select sender ,max(time) as lastTime
From table1
Where receiver = 34
Group by sender) T2
On T.sender = T2.sender
and T.time = T2.lastTime
And T.receiver = 34
有很多方法可以实现它,一种方法是使用左连接,然后使用连接条件对数据进行分组,最后是用于进一步过滤的附加条件
select
m.* from messages m
left join messages m1 on m1.receiver = m.receiver
and m.id < m1.id
and m.sender = m1.sender
where m1.id is null
and m.receiver = 34;
另一种方法是使用exists
作为group by
的替代方案
select m.* from messages m
where not exists
(
select 1 from messages m1
where
m1.receiver = m.receiver
and m.id < m1.id
and m.sender = m1.sender
)
and m.receiver = 34;
演示