【问题标题】:Private chat system MYSQL query to display last message of sender/receiver私聊系统MYSQL查询显示发送方/接收方的最后一条消息
【发布时间】:2012-06-12 02:16:39
【问题描述】:

我在这里扩展我之前的问题。

Private chat system MYSQL query ORDERBY and GROUPBY

此外,我还创建了一个名为 users 的表,我将从中获取用户信息。

消息表

  message_id|sender_id||receiver_id|message_text|   created_time
    1         101          102       Message A    2012-06-07 08:07:18
    2         101          102       Message B    2012-06-07 08:10:20
    3         103          102       Message C    2012-06-07 08:12:43

用户表:

 id  | name
 101   bob
 102   jack
 103   mark

现在终于可以得到以下结果了:

      name|message_text |  created_time
      mark   message C    2012-06-07 08:12:43
      bob    message B    2012-06-07 08:10:20

通过使用这个查询:

SELECT * FROM messages,users
WHERE messages.receiver_id = 102
AND messages.sender_id=users.id
AND messages.created_time IN
(SELECT MAX(created_time)
FROM messages
GROUP BY sender_id)
ORDER BY messages.created_time DESC

现在我想要的结果是

如果 jack(id:102) 回复 mark(id:103) 那么我怎样才能得到这个输出:

      name|message_text |  created_time
      mark   message D    2012-06-07 08:12:48
      bob    message B    2012-06-07 08:10:20

注意:这里的“消息 D”和时间戳是杰克回复标记的。

message_text 字段将显示 mark 和 jack 之间的最后一条消息 created_time 字段将显示消息创建时间 名称字段将显示杰克正在向其发送或接收消息的人的姓名。

我认为我们需要修改/拆分表,但不知道如何以及使用什么查询来完成这项任务。

【问题讨论】:

  • 我在你的表中没有看到message D
  • @Jadzia 这是群消息系统吗?
  • 如果jack回复markmessage D的发件人应该是jack我猜?
  • @Jack D R 说的是正确的。如果 jack 正在回复,那么消息 D 将是 jack。
  • DR 如果您在 badoo.com 和 tagged.com 等网站上看到聊天系统。他们正在使用我正在尝试做的聊天系统。

标签: php mysql sql database


【解决方案1】:

您要求的基本上是按线程而不是发件人分组。无论是发送者还是接收者,都可以在两个人之间发起线程。

为此,我建议您更改数据结构,类似于此处讨论的内容:Is there a simpler way to achieve this style of user messaging?

【讨论】:

  • 是的!我一直在寻找这样的东西。让我试试看..:)
  • 好吧,杰克,所以我按照你说的创建了所有表格。现在什么查询会给我想要的结果?
  • @Jadzia 线程充满了查询,应该让您了解如何解决它。
【解决方案2】:

如果这是群聊,请不要限制为像 messages.receiver_id = 102 这样的接收者 ID

SELECT users.name,
       temp.MESSAGE_TEXT,
       temp.created_time
FROM
  (SELECT sender_id, MESSAGE_TEXT, created_time
   FROM messages
   WHERE created_time IN
       (SELECT MAX(created_time)
        FROM messages
        GROUP BY sender_id)) AS temp
LEFT JOIN users ON temp.sender_id = users.id;

显示每个发件人发送的最后一条消息

【讨论】:

  • DR 再次感谢您的回复。但这当然仅限于receiver_id。如果你能让你看看杰克在说什么。这是我想要的,但仍然有问题。
  • 实际上查询我正在寻找的将是所有消息的摘要页面。如果您愿意,我可以为您制作演示图形...
  • 是的,你最好更新你的问题。有人会回答。对不起!我现在有点忙..
猜你喜欢
  • 1970-01-01
  • 2018-10-09
  • 1970-01-01
  • 2015-05-30
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
  • 2013-01-19
  • 1970-01-01
相关资源
最近更新 更多