如何统计上月订单支付方式?需保留未产生订单的支付方式
解决方案:显示所有支付方式(含未使用的)的上月使用频次
核心思路是以支付方式全量表作为查询主表,通过左关联订单数据,确保即使没有匹配的上月订单,支付方式记录也会被保留,频次统计为0。以下是适配不同表结构的示例:
示例1:订单与支付方式通过中间表关联
假设存在:
webshop_payment_methods:支付方式表(含id、payment_name、status等字段)webshop_order_payments:订单-支付方式关联表(含order_id、payment_method_id)webshop_orders:订单表(含id、created_at等字段)
SELECT pm.id, pm.payment_name, COUNT(wop.order_id) AS usage_count FROM webshop_payment_methods pm LEFT JOIN webshop_order_payments wop ON pm.id = wop.payment_method_id LEFT JOIN webshop_orders wo ON wop.order_id = wo.id AND DATE(wo.created_at) > CURDATE() - INTERVAL 1 MONTH -- 时间条件放在JOIN的ON中,避免过滤无订单的支付方式 WHERE pm.status = 1 -- 过滤启用状态的支付方式,可按需调整 GROUP BY pm.id, pm.payment_name ORDER BY usage_count DESC, pm.payment_name ASC;
示例2:订单表直接包含支付方式字段
如果订单表webshop_orders自带payment_method_id字段,可简化为:
SELECT pm.id, pm.payment_name, COUNT(wo.id) AS usage_count FROM webshop_payment_methods pm LEFT JOIN webshop_orders wo ON pm.id = wo.payment_method_id AND DATE(wo.created_at) > CURDATE() - INTERVAL 1 MONTH WHERE pm.status = 1 GROUP BY pm.id, pm.payment_name ORDER BY usage_count DESC;
关键逻辑说明
- 主表选择:以支付方式表作为主表,确保所有存在的支付方式都会被查询到。
- 条件位置:将上月订单的时间条件放在
LEFT JOIN的ON子句中,而非WHERE子句——若放在WHERE里,会过滤掉左关联后订单字段为NULL的记录,等同于内联查询,丢失未使用的支付方式。 - 频次统计:使用
COUNT(关联的订单ID字段)而非COUNT(*),因为左关联后无匹配订单的记录中,关联字段为NULL,COUNT()会忽略NULL值,统计结果为0,正好对应未使用的情况。
内容的提问来源于stack exchange,提问作者dylan0344
相关产品推荐
相关产品推荐

