3

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

私聊系统MYSQL查询ORDERBY和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 字段之间的最后一条消息 created_time 字段将显示消息创建时间,name 字段将显示 jack 正在向其发送或接收消息的人的姓名。

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

4

2 回答 2

0

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

为此,我建议更改您的数据结构,类似于此处讨论的内容:是否有更简单的方法来实现这种用户消息传递方式?

于 2012-06-08T05:21:32.910 回答
0

如果这是一个群聊,请不要限制为 receiver_id 之类的messages.receiver_id = 102

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;

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

于 2012-06-08T06:06:55.687 回答