如何合并两个SQL查询以统计各支付方式的使用次数
问题根因
你的SQL中JOIN的关联条件缺失,触发了笛卡尔积(交叉连接),导致统计结果异常:
你写的JOIN orders ON payment_method_id没有指定两个表的关联字段匹配规则,等价于只要payment_method_id字段不为空就匹配,最终每个支付方式都会和所有订单行做交叉关联,所以统计出来的数量全都是订单表的总条数,和支付方式没有对应关系。
正确实现方案
场景1:仅返回有使用记录的支付方式
如果不需要展示从未被使用的支付方式,用内连接即可:
SELECT pm.name, COUNT(o.id) AS order_count FROM payment_method pm INNER JOIN orders o ON pm.id = o.payment_method_id GROUP BY pm.id, pm.name;
分组时额外加上
pm.id是为了避免出现同名支付方式时统计结果出错,更符合业务逻辑。
场景2:返回所有支付方式(未使用的显示次数为0)
如果需要把从未产生过订单的支付方式也列出来,就用左连接,同时调整统计逻辑:
SELECT pm.name, COUNT(o.id) AS order_count FROM payment_method pm LEFT JOIN orders o ON pm.id = o.payment_method_id GROUP BY pm.id, pm.name;
可选拓展:仅统计支付完成的订单
如果需要过滤掉未完成支付的订单,可以加对应条件:
SELECT pm.name, COUNT(o.id) AS order_count FROM payment_method pm LEFT JOIN orders o ON pm.id = o.payment_method_id AND o.payment_completed_date IS NOT NULL GROUP BY pm.id, pm.name;
内容的提问来源于stack exchange,提问作者BohPomozet
相关产品推荐
相关产品推荐

