【问题标题】:Grouping messages as conversations将消息分组为对话
【发布时间】:2013-02-10 16:22:47
【问题描述】:

我正在尝试将对话中的消息分组,以便将它们作为对话阅读。

这就是我现在拥有的

messages

id | from | to | message | timestamp  
1  | 1    | 2  | 'Hello' | 1351257766
2  | 1    | 3  | 'Hey!'  | 1351257767
3  | 2    | 1  | 'Hay!'  | 1351257768

messages.frommessages.to 字段对应于users 表中的一行。

我想做的是:(不在同一个查询中)

一个。获取来自用户的所有对话的最后消息列表(因此fromto 等于给定的user.id
湾。获取属于某个对话的所有消息。

SELECT
-- From-user:
    users_from.id               AS from_id,
    users_from.username         AS from_username,
    users_from.nickname         AS from_nickname,
    users_from.username_safe    AS from_username_safe,
    users_from.password         AS from_password,
    users_from.email            AS from_email,
    users_from.rank             AS from_rank,
    users_from.email            AS from_email,
    users_from.ip               AS from_ip,
    users_from.last_online      AS from_last_online,
    users_from.register_stamp   AS from_register_stamp,
    users_from.state            AS from_state,
    users_from.icon             AS from_icon,

-- To-user:
    users_to.id                 AS to_id,
    users_to.username           AS to_username,
    users_to.nickname           AS to_nickname,
    users_to.username_safe      AS to_username_safe,
    users_to.password           AS to_password,
    users_to.email              AS to_email,
    users_to.rank               AS to_rank,
    users_to.email              AS to_email,
    users_to.ip                 AS to_ip,
    users_to.last_online        AS to_last_online,
    users_to.register_stamp     AS to_register_stamp,
    users_to.state              AS to_state,
    users_to.icon               AS to_icon,

-- Messages:
    messages.id,
    messages.from,
    messages.to,
    messages.message,
    messages.timestamp


FROM messages

-- Some joins to get the userdata
INNER JOIN users AS users_to
    ON messages.to = users_to.id
INNER JOIN users AS users_from
    ON messages.from = users_from.id

-- We only want the latest messages:
RIGHT JOIN (
    SELECT
        max(messages.id) AS maxid,
        messages.from,
        messages.to
    FROM messages
    WHERE messages.to = {userid} OR messages.from = {userid}
) limiter
    ON messages.id = limiter.maxid

这是我现在正在使用的,但它不起作用。它只返回一个对话。

我希望你们能帮助我完成这项工作!

更新: 给出的答案不起作用。当用户 1 向用户 2 发送消息时,它起作用了。然而,当用户 2 回复时,它开始了单独的对话(作为结果中的新行)。

【问题讨论】:

  • 我不认为你可以用你拥有的数据来做到这一点。我没有看到任何可以识别对话的内容。

标签: mysql sql join group-by


【解决方案1】:

您的查询很接近,但我认为您还需要按用户分组。这是一种方法

RIGHT JOIN (
    SELECT
        max(messages.id) AS maxid,
        messages.from,
        messages.to
    FROM messages
    WHERE messages.to = {userid} OR messages.from = {userid}
    group by messages.from, messages.to
) limiter

您对对话的定义似乎是拥有相同的两个用户。为此,请使用in:

select m.*
from messages m
where `from` in ({userid1}, {userid2}) and
      `to` in ({userid1}, {userid2})

顺便说一下,fromto 是错误的列名,因为 from 是保留字。

【讨论】:

  • 谢谢!这实际上正在工作。我会去更广泛地测试一下。
  • 您如何建议我查询我的问题的 b 部分?
  • 很抱歉,这不起作用。当用户'1'向'2'发送消息时,没关系。但是当“2”回复时,它们被视为 2 个单独的条目。我想要 2 -> 1 和 1 -> 2 作为一个对话。
  • @jeroenvisser101 。 . .你需要澄清你的意思。第二个查询获取两个人之间的所有消息。这似乎是您正在使用的对话的定义。
  • 我找到了一个更好、更简单的解决方案。我有一个新表,其中记录了每次对话。这样,就没有极端的查询;)谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-29
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-12
相关资源
最近更新 更多