三表关联时两个COUNT查询结果异常相乘的问题求助
解决多表关联后COUNT结果莫名翻倍的问题
嘿,这个问题我太熟了——这是多表关联产生笛卡尔积导致的统计翻车!当你同时把prod_outlets(门店表)和vouchers(优惠券表)关联到bb_products(产品表)时,数据库会先把门店和产品的关联结果,再和优惠券表做关联。这就导致每个门店记录都会对应该产品的所有优惠券记录,最终优惠券的COUNT结果自然变成了「门店数 × 实际优惠券数」,也就是你看到的3×5=15。
修复方案1:用子查询分开统计,再关联(最稳妥)
这种方式从根源上避免了笛卡尔积,逻辑也最清晰:
SELECT po.outlets, bbp.prod_name, v.vouchersleft FROM bb_products AS bbp LEFT JOIN ( -- 先单独统计每个产品对应的门店数 SELECT product_id, COUNT(DISTINCT outlet_id) AS outlets FROM prod_outlets GROUP BY product_id ) AS po ON po.product_id = bbp.prod_id LEFT JOIN ( -- 再单独统计每个产品对应的优惠券数 SELECT product_id, COUNT(purchased) AS vouchersleft FROM vouchers GROUP BY product_id ) AS v ON v.product_id = bbp.prod_id GROUP BY bbp.prod_id;
修复方案2:给COUNT加DISTINCT(适合有唯一主键的场景)
如果你的vouchers表有唯一主键(比如voucher_id),可以直接对主键用COUNT(DISTINCT)来过滤重复计数:
SELECT COUNT(DISTINCT po.outlet_id) AS outlets, bbp.prod_name, COUNT(DISTINCT v.voucher_id) AS vouchersleft -- 用优惠券唯一ID去重 FROM prod_outlets AS po INNER JOIN bb_products AS bbp ON po.product_id = bbp.prod_id INNER JOIN vouchers AS v ON v.product_id = bbp.prod_id GROUP BY bbp.prod_id;
小提醒:别直接用
COUNT(DISTINCT purchased),除非你能保证purchased字段的值绝对唯一,不然可能还是会统计不准,优先用表的唯一主键更靠谱。
为啥第一条COUNT是对的?
因为你给outlet_id加了DISTINCT,哪怕笛卡尔积产生了重复的门店ID,DISTINCT会帮你去重,所以得到了正确的3家门店;而第二条COUNT没加去重,就把所有重复生成的优惠券记录都算进去了,结果自然就翻了倍。
内容的提问来源于stack exchange,提问作者user8463989
相关产品推荐
相关产品推荐

