MySQL单查询统计forwarded_to_cordroom不同值订单数报错求解
你遇到的报错是因为SQL中使用了聚合函数COUNT()但没有搭配GROUP BY,且SELECT列表中第二个字段没有经过聚合函数处理,不符合only_full_group_by模式的语法要求,同时你原有子查询的写法也无法实现分别统计两个值的需求。
方案1:按状态分组输出两行结果
如果你想要结果为两行,分别对应forwarded_to_cordroom=0和forwarded_to_cordroom=1的统计值,可以直接按该字段分组:
SELECT o.forwarded_to_cordroom, COUNT(DISTINCT o.order_id) as count FROM `orders_articles` o INNER JOIN orders oo ON o.order_id = oo.order_id WHERE (oo.finished_order_date IS NULL OR oo.finished_order_date >= '2021-09-27') AND oo.order_date <= '2021-09-27' GROUP BY o.forwarded_to_cordroom
说明:原有LEFT JOIN实际等同于INNER JOIN,因为WHERE条件中对oo.order_date的判断会自动排除关联不到的空值记录,所以直接改为INNER JOIN性能更优。分组后forwarded_to_cordroom作为分组字段可以直接出现在SELECT列表中,完全符合only_full_group_by的规范。
方案2:一行输出两个状态的统计值
如果你想要在同一行分别得到两个状态的计数,可以使用条件聚合:
SELECT COUNT(DISTINCT CASE WHEN o.forwarded_to_cordroom = 1 THEN o.order_id END) AS count_forwarded_1, COUNT(DISTINCT CASE WHEN o.forwarded_to_cordroom = 0 THEN o.order_id END) AS count_forwarded_0 FROM `orders_articles` o INNER JOIN orders oo ON o.order_id = oo.order_id WHERE (oo.finished_order_date IS NULL OR oo.finished_order_date >= '2021-09-27') AND oo.order_date <= '2021-09-27'
说明:CASE WHEN会把不符合条件的行返回NULL,而COUNT()不会统计NULL值,因此可以实现分条件计数,整个查询只有聚合结果,不需要GROUP BY,也符合only_full_group_by的要求。
内容的提问来源于stack exchange,提问作者Desory
相关产品推荐
相关产品推荐

