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

MySQL GROUP BY报错1055,执行讲师SQL代码失败求助

解决MySQL GROUP BY 1055错误问题

问题根源

你碰到的Error Code: 1055,核心原因是MySQL的ONLY_FULL_GROUP_BY模式有严格规则:SELECT列表里的非聚合列,要么出现在GROUP BY子句中,要么和GROUP BY中的列存在函数依赖关系。

讲师的代码里GROUP BY m.emp_no,但SELECT包含m.dept_no和d.dept_name,这两个列既不在GROUP BY里,也无法证明每个emp_no唯一对应一组dept_no和dept_name,所以触发报错。讲师能执行成功,大概率是他的MySQL环境没开ONLY_FULL_GROUP_BY,或者他的dept_manager_dup表中每个员工(emp_no)确实只对应一个部门(dept_no),MySQL自动识别了这种依赖关系。

方案一:规范修改SQL(推荐)

不建议关闭ONLY_FULL_GROUP_BY,它能帮你避免逻辑错误的分组结果。根据需求,有两种修改方式:

方式1:将所有非聚合列加入GROUP BY

SELECT
    m.dept_no, m.emp_no, d.dept_name
FROM
    dept_manager_dup m
LEFT JOIN
    departments_dup d  ON m.dept_no = d.dept_no
GROUP BY 
    m.emp_no, m.dept_no, d.dept_name
ORDER BY 
    m.dept_no;

方式2:使用聚合函数(若每个emp_no对应唯一的部门信息)

如果dept_manager_dup中一个员工只会对应一个部门,用MAX()或MIN()这类聚合函数包裹非GROUP BY列即可(单值聚合结果不变):

SELECT
    MAX(m.dept_no) AS dept_no, m.emp_no, MAX(d.dept_name) AS dept_name
FROM
    dept_manager_dup m
LEFT JOIN
    departments_dup d  ON m.dept_no = d.dept_no
GROUP BY 
    m.emp_no
ORDER BY 
    dept_no;

方案二:彻底关闭ONLY_FULL_GROUP_BY(不推荐)

如果一定要用讲师的原始代码,需要确保ONLY_FULL_GROUP_BY被彻底关闭,步骤如下:

  1. 同时修改全局和当前会话的sql_mode:
-- 修改全局设置
set @@global.sql_mode := replace(@@global.sql_mode, 'ONLY_FULL_GROUP_BY', '');
-- 修改当前会话设置
set @@session.sql_mode := replace(@@session.sql_mode, 'ONLY_FULL_GROUP_BY', '');
  1. 永久生效(避免重启MySQL后恢复):
    找到MySQL配置文件(Windows为my.ini,Linux为my.cnf),在[mysqld]段添加或修改:
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"

确保去掉其中的ONLY_FULL_GROUP_BY,保存后重启MySQL服务。

内容的提问来源于stack exchange,提问作者Shaun Eric

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 21:32:10