私人聊天系统MYSQL查询显示发件人/收件人的最后一条消息

时间:2012-06-08 00:40:23

标签: php mysql sql database

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

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字段将显示标记和插孔之间的最后一条消息 created_time字段将显示消息创建时间 和名称字段将显示插孔发送或接收消息的人员的姓名。

我在想我们需要修改/拆分表,但不知道如何以及什么查询将执行此任务。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

如果这是群聊,请不要限制为messages.receiver_id = 102

之类的receiver_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;

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

相关问题