You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 17:27:03