SQL - 从每个对话中获取最后一条消息

时间:2016-07-26 16:58:21

标签: mysql sql greatest-n-per-group

我有一个SQL表,其中包含所有用户和组中的对话。我可以轻松地从中检索群组对话,但不知道如何从中检索每个用户的最后消息。

列说明:

message_id:自我解释

group_id:由于会话还包含群组消息,因此我将使用group_id过滤这些消息,而不是为其创建新的消息传递表。

用户:发件人/收件人(通过定义最后一栏'isReceived'的值,可以是发件人或收件人)。

消息:自我解释

创作:自我解释

isSeen:如果用户(接收方)已看到该消息。

isError:如果发送邮件时出错。

isReceived:检查邮件是否已被默认用户接收或发送。

现在我真正想要的是检索所有会话的最后消息,无论是发送还是接收。例如,'Sondre'(另一个用户)给我发了一条消息“嗨”,现在我给他发了一条回复/消息“你好”,当我从消息表中检索数据时,我希望我的回复显示而不是他的回复。我还使用我想要的查询上传了当前数据和数据的照片:

消息数据表:

enter image description here

我想要使用查询的数据:

enter image description here

1 个答案:

答案 0 :(得分:4)

您需要分两部分来完成最新消息,按用户分组 然后根据这些

获取您的邮件

最简单的答案是(如果你真的有一个message_id是唯一的/主键,它会正常工作)

select * from messages where message_id in
(select max(message_id) from messages group by user)

它会给你每个用户的最新消息,你也可以用其他东西而不是用户分组

您需要的完美答案是

select messages.* from messages
join
(select max(creation) maxtime,user from messages group by user) latest
on messages.creation=latest.maxtime and messages.user=latest.user;

即使你没有像message_id这样的唯一/主键列,Abvove也会有效,但是如果你真的拥有它,那么我建议使用message_id而不是创建

您可以看到已实施SQL Fiddle Demo