如何编写SQL查询语句关联3张表获取每个成员的所有手机及PC端消息
实现思路
- 先对齐
phone_message和pc_message两张消息表的字段结构,通过UNION合并为统一的消息集合,补充标识区分消息来源 - 再将合并后的消息集合与
member表关联,匹配对应成员信息,最终输出每个成员的全量消息
可用SQL语句
SELECT m.id AS member_id, m.cell_num, merged_msg.content, merged_msg.msg_time, merged_msg.msg_source FROM member m INNER JOIN ( -- 整合手机端接收的消息 SELECT mem.id AS bind_member_id, pm.content, pm.received_at AS msg_time, '手机端接收' AS msg_source FROM phone_message pm INNER JOIN member mem ON pm.phone_num = mem.cell_num UNION ALL -- 整合PC端发送的消息 SELECT pcm.member_id AS bind_member_id, pcm.content, pcm.sent_at AS msg_time, 'PC端发送' AS msg_source FROM pc_message pcm ) merged_msg ON m.id = merged_msg.bind_member_id -- 按成员ID+消息时间排序,方便查看单个成员的消息时序 ORDER BY m.id, merged_msg.msg_time;
补充说明
- 这里用
UNION ALL而非UNION,是因为两个消息表不存在重复数据场景,UNION ALL执行效率更高,如果你有去重需求可直接替换为UNION - 如果你需要保留没有任何消息的成员记录,可把外层的
INNER JOIN替换为LEFT JOIN
内容的提问来源于stack exchange,提问作者jo1242
相关产品推荐
相关产品推荐

