【问题标题】:SQL - Get last message from each conversationSQL - 从每个对话中获取最后一条消息
【发布时间】:2016-07-26 16:58:21
【问题描述】:

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

列说明:

message_id:不言自明

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

用户:发送者/接收者(通过定义最后一列“isReceived”的值,它可以是发送者或接收者)。

消息:不言自明

创作:不言自明

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

isError:如果发送消息时出错。

isReceived:检查消息是否由默认用户接收或发送。

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

消息表数据:

我想要使用查询的数据:

【问题讨论】:

  • 没有图片,谢谢。相反,请考虑遵循这个简单的两步操作过程: 1. 如果您还没有这样做,请提供适当的 CREATE 和 INSERT 语句(和/或 sqlfiddle),以便我们可以更轻松地复制问题。 2. 如果您尚未这样做,请提供与步骤 1 中提供的信息相对应的所需结果集。
  • 对不起,如果我忘记提及这是一个问题,我希望你们帮助我找到一种方法来从消息表中检索每个用户的最后一条消息。我使用了 SELECT 和 GROUP BY 语句,但它对我没有帮助,结果也不是我所期望的。
  • @Strawberry:我使用了“SELECT * FROM messages GROUP BY user”,但它对我不起作用。我想要“消息”表中每个用户的最后一条消息。

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


【解决方案1】:

您需要分两部分进行首先获取最新消息,按用户分组 然后根据这些获取您的消息

最简单的答案是(如果您确实拥有 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

【讨论】:

  • 第一个让我有点困惑。每当我执行该查询时,它都会给我一个错误,请参阅:“您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以获取正确的语法以在 'join (select max(message_id) id来自按用户分组的消息) latest on latest.i'
  • 已编辑.. 现在应该可以使用了。单击链接“SQL Fiddle 演示”。那里有多个查询。都在工作。使用蚂蚁其中之一
  • @user1873111。你应该接受答案。如果你不知道该怎么做。请阅读这个。 stackoverflow.com/help/accepted-answer
  • 我不知道,但感谢您告诉我。我已经接受了这个答案。
  • 尝试使用相同的查询,select * from messages where message_id in (select max(message_id) from messages group by user),或者如果您想查看每个组的最新消息,则需要按 group_id 将其分组,例如 select * from messages where message_id in (select max(message_id) from messages group by group_id)
猜你喜欢
  • 2016-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多