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
相关产品推荐
相关产品推荐

