【问题标题】:Get the first message of every conversation获取每个对话的第一条消息
【发布时间】:2013-10-18 17:55:25
【问题描述】:

我有一张表来存储在 xmpp 服务内发送的所有消息。我希望创建一个查询来获取所有对话及其第一条消息(例如聊天日志中的 whatsapp)。

这是我的桌子。

FromPersonIdToPersonId 是人们的 ID。我所做的是,例如我想查看 personId = 643 的所有对话

SELECT DISTINCT MA.FromPersonId, MA.ToPersonId, MAX(MA.SENTDATE) AS [Date], Body
    FROM MessageArchive AS MA
    WHERE MA.FromPersonId = @personId OR MA.ToPersonId = @personId
    GROUP BY MA.FromPersonId, MA.ToPersonId, Body
    ORDER BY [Date] DESC

以上是我所拥有的。结果是

如您所见,结果是相同的对话。但无法区分那是同一个对话,因为是同一个人但处于不同的位置。

我该如何解决这个问题?

【问题讨论】:

  • 那么,每一行都是这样重复的吗?将“from”和“to”颠倒存储相同的对话有什么意义?这是您的应用程序的错误吗?
  • 可以使用类似 CASE WHEN FromPersonId
  • 另外,我将提出 Lamak 所说的关于他们在同一毫秒内相互发送相同消息的说法,但我认为这是测试数据,您的问题更侧重于如何对这些数据进行分组两行一起作为一个对话。
  • 我们只是没有在您的屏幕截图中看到 644 到 643 的片段吗?
  • 当我查看您的示例数据时,我看不到第二个查询结果来自哪里。无论如何,根据您定义对话的方式,您可能没有足够的数据来完成此操作..

标签: sql sql-server sql-server-2008 database-design stored-procedures


【解决方案1】:

您错过了 644 到 643 消息,假设它存在,我建议将 ROW ID 自动递增,此列可以为您提供关于哪些记录在先和哪些记录在后的确切信息,此外,您如何识别消息是一样的吗?

【讨论】:

    【解决方案2】:

    您缺少一个“对话”表,其中一个对话 ID 字段是您的 MessageArchive 表中的一个外键,作为对话实体和消息实体之间存在的“一对多”关系的表现:一个对话至少包含一条消息,并且每条消息都与一个且仅一个会话相关。

    使用这样的数据库模型,您将能够收集每个对话的“前 1”消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-09
      • 1970-01-01
      相关资源
      最近更新 更多