LEFT JOIN结合GROUP BY时COUNT(*)统计结果异常问题
问题原因与解决方案
问题根源
你的查询用LEFT JOIN关联后,COUNT(*)统计的是关联后的所有行数量,而非你需要的「分组内不同产品的数量」:
P-00493/ANY-C2-O在dp_ventes_qty中有3条匹配记录,关联后会生成3行重复数据P-00492/ANY-C4-O在dp_ventes_qty中无匹配记录,关联后保留1行(dp_ventes_qty字段为NULL)
最终COUNT(*)会得到3+1=4,和预期的2不符。
修正后的SQL
方案1:直接统计分组内唯一产品数
使用COUNT(DISTINCT 产品ID)替代COUNT(*),忽略关联产生的重复行:
SELECT LEFT( SUBSTRING_INDEX(dp_ventes_par_segments.ref_article, '/', -1), LOCATE('-', SUBSTRING_INDEX(dp_ventes_par_segments.ref_article, '/', -1)) - 1 ) AS r, COUNT(DISTINCT dp_ventes_par_segments.ref_article) AS count FROM `dp_ventes_par_segments` LEFT JOIN dp_ventes_qty ON dp_ventes_par_segments.ref_article = dp_ventes_qty.dp_ventes_id GROUP BY r;
方案2:先分组产品表再关联(更高效)
先对产品表按目标规则分组,再关联数量表,避免提前生成重复数据:
WITH product_groups AS ( SELECT LEFT( SUBSTRING_INDEX(ref_article, '/', -1), LOCATE('-', SUBSTRING_INDEX(ref_article, '/', -1)) - 1 ) AS r, ref_article FROM dp_ventes_par_segments ) SELECT r, COUNT(DISTINCT ref_article) AS count FROM product_groups LEFT JOIN dp_ventes_qty ON product_groups.ref_article = dp_ventes_qty.dp_ventes_id GROUP BY r;
结果说明
两种方案都会返回:
| r | count |
|---|---|
| ANY | 2 |
完全符合你期望的统计结果。
内容的提问来源于stack exchange,提问作者user20470803
相关产品推荐
相关产品推荐

