当前位置: 首页 > 面试题库 >

选择与我交谈过的用户,并与他们交流最后一条消息,例如whatsapp

莘羽
2023-03-14
问题内容

我的数据库中有此表:

留言表

sentBysentToFK到User表。

在此表上,我有用户之间的消息:

sentBy |  sentTo  |     dateSent     |     body
-------+----------+------------------+-----------------
  1    |    2     | 11/21/2010 10:00 | Hey!
-------+----------+------------------+-----------------
  2    |    1     | 11/21/2010 10:50 | Hi!
-------+----------+------------------+-----------------
  1    |    2     | 11/21/2010 10:51 | msg body 1
-------+----------+------------------+-----------------
  2    |    1     | 11/21/2010 11:05 | msg body 2
-------+----------+------------------+-----------------
  1    |    3     | 11/21/2010 11:51 | msg body 3
-------+----------+------------------+-----------------
  3    |    1     | 11/21/2010 12:05 | msg body 4
-------+----------+------------------+-----------------
  1    |    3     | 11/21/2010 12:16 | msg body 5
-------+----------+------------------+-----------------
  4    |    1     | 11/21/2010 12:25 | msg body 6
-------+----------+------------------+-----------------

我需要知道与用户1交谈过的 用户以及与用户1交谈过的用户
。在这种情况下,对于用户2、3和4(请注意,用户4已向用户1发送了一条消息,但用户1尚未发送任何消息)。

第二个问题是: 我该如何与每个用户获取最后一条消息? 我要求将最新消息发送给用户。

例如,如果我要询问用户1,则用户2的最新消息为:味精正文2。而用户3的最新消息为味精正文5。

如何在一条SQL SELECT语句中获取该信息? 也许我将需要两个选择。

我正在尝试做类似 WhatsApp的
事情。在您的聊天屏幕上,有一个与我交谈过的用户列表(我的第一个问题)和与他们最近的消息(我的第二个问题)的列表。

也许我可以创建一个名为另一个表Conversation,移动sentBysentTo该表,并最后消息发送给它的日期,但我认为这不可能是一个不错的设计。

我的两个问题的结果是:

sentBy |  sentTo  |     dateSent     |     body
-------+----------+------------------+-----------------
  2    |    1     | 11/21/2010 11:05 | msg body 2
-------+----------+------------------+-----------------
  1    |    3     | 11/21/2010 12:16 | msg body 5
-------+----------+------------------+-----------------
  4    |    1     | 11/21/2010 12:25 | msg body 6
-------+----------+------------------+-----------------

问题答案:

以下查询将为用户1提供预期的结果:

select m.* from messages m
join (
  select auser,withuser,max(datesent) datesent from (
    select sentby as auser,sentto as withuser,datesent from messages 
    union
    select sentto as auser,sentby as withuser,datesent from messages 
    ) as ud
  group by auser,withuser
  ) maxud 
  on (m.datesent=maxud.datesent and maxud.auser in (m.sentBy,m.sentTo))
where auser=1

不用说,您可以更改where子句中的条件,以使任何用户获得相似的结果。

但是,我的方法是创建一个视图,然后从中选择视图,如下所示:

create view conversation_stuff as
select m.sentBy,m.sentTo,m.dateSent,m.body,maxud.auser,maxud.withuser
from messages m
join (
  select auser,withuser,max(datesent) datesent from (
    select sentby as auser,sentto as withuser,datesent from messages 
    union
    select sentto as auser,sentby as withuser,datesent from messages 
    ) as ud
  group by auser,withuser
  ) maxud 
  on (m.datesent=maxud.datesent and maxud.auser in (m.sentBy,m.sentTo))

select sentBy,sentTo,dateSent,body from conversation_stuff where auser=1;

我猜这也可能对其他用途有用。

编辑 :更改userauser无处不在,为sqlserver停止抱怨 避免[]s …



 类似资料:
  • 问题内容: 有没有办法获得最后的提交消息而无需访问存储库?尝试连接到仓库。 编辑:我有凭据设置,并使用它们来签出源。 我要实现的目标是让Jenkins根据提交消息触发另一个作业,即是否包含字符串“ #build”启动作业X。我的尝试是在Shell Build Step中解析它并执行一个作业取决于结果。但是由于我没有匿名访问该存储库的权限,也不想将凭据嵌入到shell脚本中,所以我不知道如何实现此目

  • 请我需要流构建器小部件返回这最后一条消息(红色矩形框)在我的消息集合。我在下面使用的返回空字符串的方法必须在Text小部件中提供。 当我试图从消息集合下的最后一个消息字段获取消息时,它返回的错误(即必须在Text小部件中提供空字符串)发生在Text(message.message)处。

  • 工程师和程序员(尤其是)通常被主流文化认为与他人不同。这意味着其他人与我们不同。与非工程师交流时,这是值得记在心里的,你应该时刻去理解观众。 非工程师聪明,但在创造技术类的东西不像我们那样踏实。我们制造东西。他们销售,处理,统计,管理,但他们在制造上不是专家。他们不像工程师那样擅长团队合作(毫无疑问会有例外。)他们的社交技能在非团队环境里通常像工程师那样,甚至比工程师要好,但他们的工作不总要求他们

  • 这是一个非常非常简单的情况,但我找不到解决办法。 请注意,我们没有台式手机,我们使用公司发行的iPhone,所以我们晚上不会把iPhone留在工作中。

  • 问题内容: 我正在尝试从表中进行SQL查询,-从所有对用户中以用户36作为发送者或接收者的最后一条消息,并将它们与用户表结合起来以获取名称。我已经设法创建了这样的东西,但仍然想问一下是否还有更简单的方法。有效的解决方案。MySQL版本-5.5.31 询问: 谢谢。更新。样本消息表中的数据: mysql> SELECT id,sender_user_id,receiver_user_id,文本,日期

  • 问题内容: 我有一个简单的应用程序,通过Async任务与其Servlet后端进行通信。我很难理解消息是如何包装的以及如何操纵这些消息的数据结构。我要做的是无论如何都接收多个对象或多个异构信息。我的代码: 还有我的异步任务类: 响应消息以文本形式返回ArrayList: 但是,我想要的是将它按原样存储为ArrayList。如何配置异步任务以接收我的m_tours ArrayList并将其存储在某个地