如何通过MySQL查询获取聊天消息表的唯一相关详情?
嘿,我看你是想拿到和用户ID为6相关的聊天消息的唯一详情,应该是要每个对话的最新那条记录吧?我来给你梳理下怎么实现。
先明确你的表结构与示例数据
你的enrich_chat_message表结构和现有数据如下:
| id | sent_by | message | read | received_by | created_at | updated_at |
|---|---|---|---|---|---|---|
| 786 | 6 | Hi | 0 | 1 | 2018-04-26 13:00:15 | 2018-04-26 13:00:15 |
| 774 | 211 | Hello | 1 | 6 | 2018-04-26 12:20:25 | 2018-04-26 12:59:59 |
| 772 | 1 | hi | 1 | 6 | 2018-04-26 12:19:28 | 2018-04-26 13:00:14 |
解决方案:获取每个对话的最新消息详情
你原来的查询思路是对的,但需要完善分组逻辑,确保能按对话对象分组取最新消息。这里用子查询先找出每个对话的最大消息ID,再关联原表拿到完整的消息详情:
SELECT m.* FROM enrich_chat_message m INNER JOIN ( -- 先分组找出每个聊天对象对应的最新消息ID SELECT -- 确定对话的对方用户:如果当前用户是发送方,对方就是接收方,反之亦然 CASE WHEN sent_by = 6 THEN received_by ELSE sent_by END AS chat_partner, MAX(id) AS latest_msg_id FROM enrich_chat_message -- 筛选出所有和用户6相关的消息 WHERE sent_by = 6 OR received_by = 6 GROUP BY chat_partner ) AS latest ON m.id = latest.latest_msg_id -- 按消息创建时间倒序,最新的消息排在最前面 ORDER BY m.created_at DESC;
执行结果说明
运行这个查询后,你会得到用户6和每个聊天对象的最新一条消息:
- 和用户1的最新消息是ID为786的「Hi」(用户6发给用户1,未读状态)
- 和用户211的最新消息是ID为774的「Hello」(用户211发给用户6,已读状态)
如果你的需求是其他类型的「唯一详情」(比如所有未读消息的唯一记录),只需要在主查询的WHERE条件里加上对应的筛选,比如AND m.read = 0就可以了。
内容的提问来源于stack exchange,提问作者user3201500
相关产品推荐
相关产品推荐

