我在这里扩展我之前的问题。
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字段将显示消息创建时间 和名称字段将显示插孔发送或接收消息的人员的姓名。
我在想我们需要修改/拆分表,但不知道如何以及什么查询将执行此任务。
答案 0 :(得分:0)
您要求的基本上是按线程而不是发件人进行分组。线程可以在两个人之间启动,无论是发送者/接收者。
要做到这一点,我建议您更改数据结构,类似于此处讨论的内容:Is there a simpler way to achieve this style of user messaging?
答案 1 :(得分:0)
如果这是群聊,请不要限制为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;
显示每个发件人发送的最后一条消息