SQL查询未返回预期结果,涉及两张数据表结构及数据
看起来你在处理主消息和子消息关联查询时遇到了结果不符合预期的问题,我先帮你理清楚两张表的结构,再针对几种常见的场景给出解决方案:
表结构梳理
tbl_message(主消息表)
| id | user_id | user_name | message | society_id |
|---|---|---|---|---|
| 1 | 252 | Shubham | HeyHi | 3 |
| 2 | 252 | Shubham | HeyHi | 3 |
| 3 | 250 | Rahul | HeyHi | 3 |
| 4 | 251 | Sachin | HeyHi | 3 |
tbl_submessage(子消息表)
| id | post_id | user_id | submessage |
|---|---|---|---|
| 1 | 1 | 252 | Hi |
| 2 | 1 | 252 | Hi |
| 3 | 1 | 253 | Hi |
| 4 | 1 | 253 | Hi |
| 5 | 1 | 253 | Hi |
| 6 | 2 | 254 | ... |
常见问题及解决方案
问题1:关联查询后主消息重复出现
因为一个主消息对应多条子消息,直接JOIN会导致主消息记录被重复展示。如果只想看每个主消息的汇总数据(比如子消息数量、回复用户数),可以用聚合函数配合分组:
SELECT m.id AS post_id, m.user_name AS post_author, COUNT(s.id) AS total_submessages, COUNT(DISTINCT s.user_id) AS unique_repliers FROM tbl_message m LEFT JOIN tbl_submessage s ON m.id = s.post_id GROUP BY m.id, m.user_name;
用LEFT JOIN是为了保留那些没有子消息的主消息(比如id为3、4的记录),如果只需要有子消息的主消息,换成INNER JOIN即可。
问题2:想展示主消息详情+所有子消息内容,避免主消息重复
可以用GROUP_CONCAT把同一条主消息的所有子消息合并成一个字段:
SELECT m.id, m.user_name, m.message, GROUP_CONCAT(s.submessage SEPARATOR '; ') AS all_submessages FROM tbl_message m LEFT JOIN tbl_submessage s ON m.id = s.post_id GROUP BY m.id, m.user_name, m.message;
问题3:统计每个用户的主帖+子帖总互动数
如果需要统计每个用户发了多少主消息、多少子消息,可以用UNION ALL合并两张表的统计结果:
SELECT user_id, user_name, SUM(total_main_posts) AS total_main_posts, SUM(total_sub_posts) AS total_sub_posts FROM ( -- 统计主消息数量 SELECT user_id, user_name, COUNT(id) AS total_main_posts, 0 AS total_sub_posts FROM tbl_message GROUP BY user_id, user_name UNION ALL -- 统计子消息数量 SELECT user_id, (SELECT user_name FROM tbl_message WHERE user_id = sm.user_id LIMIT 1) AS user_name, 0 AS total_main_posts, COUNT(id) AS total_sub_posts FROM tbl_submessage sm GROUP BY user_id ) AS combined_data GROUP BY user_id, user_name;
内容的提问来源于stack exchange,提问作者Saket Mayank
相关产品推荐
相关产品推荐

