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

MySQL关联查询需包含所有行(即使SUM为0)的实现问题

问题分析与解决方案

我来帮你梳理下问题所在~你当前的SQL语句里,把rmonth表的过滤条件(rmMonth = 3、rmYear = 2018、rmUnitID IN (10603,10960,10496))放在了WHERE子句中,这会直接把LEFT JOIN后rmonth字段为NULL的行全部过滤掉——相当于变相把LEFT JOIN变成了INNER JOIN,自然就看不到sumMonth为0的行啦。

要解决这个问题,我们需要调整过滤条件的位置,同时确保所有目标alternative和指定unit的组合都能被覆盖,具体方案如下:

SELECT 
    COALESCE(SUM(rmAntal), 0) AS sumMonth,
    a.aID,
    a.aText,
    u.unitID AS rmUnitID
FROM alternatives a
-- 先生成目标unit的列表,和alternatives做交叉连接,确保每个alternative都对应所有指定unit
CROSS JOIN (
    SELECT 10603 AS unitID 
    UNION ALL SELECT 10960 
    UNION ALL SELECT 10496
) u
-- 将rmonth的过滤条件移到ON子句,避免过滤掉alternatives的行
LEFT JOIN rmonth rm 
    ON a.aID = rm.rmAltID 
    AND rm.rmMonth = 3 
    AND rm.rmYear = 2018 
    AND rm.rmUnitID = u.unitID
WHERE a.aToQuestID = 4418
GROUP BY a.aID, a.aText, u.unitID
ORDER BY a.aID ASC

关键调整说明:

  • CROSS JOIN生成unit组合:通过子查询生成你需要的三个unit列表,和alternatives做交叉连接,保证每个alternative都能和这三个unit分别配对,不会漏掉任何需要统计的组合。
  • 过滤条件移至ON子句:把rmonth的时间、unit过滤条件放在LEFT JOIN的ON里,这样只有符合条件的rmonth记录才会被关联,没有对应记录的组合会保留NULL,不会被过滤。
  • COALESCE处理空值:用COALESCE(SUM(rmAntal), 0)确保当没有对应rmonth数据时,sumMonth显示为0,符合你的预期。

内容的提问来源于stack exchange,提问作者Linus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:05:34