MySQL使用UNION ALL无法合并同电台名称行的问题排查
问题原因
UNION ALL的核心特性是直接拼接两个查询的结果行,不会对相同分组(比如同名电台)的行做合并汇总。你的两个SELECT语句已经分别按电台名称完成了分组聚合,所以同名电台会在两个查询结果中各生成一行,UNION ALL只是把这两行拼在一起,自然不会合并。
正确解决思路
需要先把「点播会话」和「直播会话」的原始数据合并成一个完整的数据集,再统一按电台名称做聚合计算,而不是各自聚合后再拼接。
修改后的SQL语句
用CTE(通用表表达式)先整合两种会话的关联数据,再外层统一汇总:
WITH tutte_le_sessioni AS ( -- 点播会话关联对应电台 SELECT s.session_id, s.user_id, s.rating, s.start_time, s.end_time, r.radio_name FROM sessione s JOIN puntata p ON p.palinsesto_id = s.palinsesto_id JOIN radio r ON r.radio_id = p.radio_id UNION ALL -- 直播会话关联对应电台 SELECT s.session_id, s.user_id, s.rating, s.start_time, s.end_time, r.radio_name FROM sessione s JOIN radio r ON s.livestream_id = r.livestream_id WHERE s.livestream_id IS NOT NULL ) SELECT COUNT(session_id) AS "Sessioni", COUNT(DISTINCT user_id) AS "Numero Utenti", AVG(rating) AS "Rating Medio", SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(end_time, start_time)))) AS Tempo_Totale_Di_Ascolto, radio_name FROM tutte_le_sessioni GROUP BY radio_name ORDER BY radio_name ASC;
关键说明
- 先通过
UNION ALL合并两种会话的原始数据(未聚合),确保每个会话都关联到对应的电台名称。 - 外层统一按
radio_name分组,此时同一电台的所有点播+直播会话会被一起计算,得到合并后的汇总值。 - 若不使用CTE,也可以把
UNION ALL的部分作为子查询放在FROM子句中,效果完全一致。
内容的提问来源于stack exchange,提问作者sickboy83
相关产品推荐
相关产品推荐

