You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 08:37:20