MySQL报错1111 Invalid use of group function 问题排查求助
错误原因分析
本次报错触发MySQL 1111错误的核心原因是聚合函数的非法使用:
- SQL的执行顺序为:
FROM > JOIN > WHERE > GROUP BY > 聚合函数计算 > HAVING > SELECT > ORDER BY - 你将
MAX(order_details.shipped_date)直接放在WHERE子句中作为判断条件,此时SQL还未执行GROUP BY分组和聚合计算,根本无法获取到每个订单对应的最大发货日期,因此触发报错。 - 额外逻辑缺陷:现有写法即使修复聚合函数报错,也无法保证返回的是每个订单对应最新发货日期的条目,且如果MySQL开启了
ONLY_FULL_GROUP_BY默认模式,SELECT中的orders.customer_fk字段未加入分组也会触发额外报错。
满足业务需求的修正方案
你的业务需求是每个order.id仅返回1条记录,且取对应最新发货日期的条目,可以通过子查询+窗口函数的方式实现,修正后的SQL如下:
SELECT o.id, o.customer_fk FROM orders o INNER JOIN ( SELECT order_fk, item_status, shipped_date, -- 按订单ID分组,发货日期倒序排序,取第一条即为对应最新发货日期的明细 ROW_NUMBER() OVER(PARTITION BY order_fk ORDER BY shipped_date DESC) AS row_num FROM order_details ) od ON od.order_fk = o.id AND od.row_num = 1 WHERE o.payment_method IN ('AS','AC') AND ( (o.order_status = 'SHP' AND od.item_status = 'SHP' AND od.shipped_date <= '2021-08-07') OR (o.order_status = 'CAN' AND o.order_date <= '2021-08-07 09:56:18') ) AND o.pii_status <> '1' -- 兼容ONLY_FULL_GROUP_BY模式 GROUP BY o.id, o.customer_fk;
实现逻辑说明
- 先通过子查询为每个订单的所有明细按发货日期倒序排序,取排序后序号为1的条目,即为每个订单最新发货日期对应的明细
- 后续过滤条件直接使用该条最新明细的发货日期做判断,不再需要使用
MAX()聚合函数,既修复了报错也满足业务需求
内容的提问来源于stack exchange,提问作者CodeForGood
相关产品推荐
相关产品推荐

