解决MySQL出现1055错误:ONLY_FULL_GROUP_BY的方法

AI 概述
典型的报错场景一、错误原因解析二、3 种解决方案(附详细示例)方案 1:完善 GROUP BY 子句(推荐⭐️⭐️⭐️⭐️⭐️)方案 2:使用聚合函数(高效方案⭐️⭐️⭐️⭐️)方案 3:临...
目录
文章目录隐藏
  1. 典型的报错场景
  2. 一、错误原因解析
  3. 二、3 种解决方案(附详细示例)
  4. 三、原问题 SQL 修复完整版
  5. 四、预防措施 & 最佳实践
  6. 总结

当我们在执行 SQL 查询时突然遇到”1055 – Expression #1 of SELECT list is not in GROUP BY clause…”错误,本文将用最简单的语言解释这个 MySQL 8.0 常见错误的原因和解决方案,希望对大家有帮助。

解决 MySQL 出现 1055 错误:ONLY_FULL_GROUP_BY 的方法

典型的报错场景

SELECT
  product_id,
  product_name,
  pic,
  sp_data,
  SUM(quantity) AS total_sales
FROM order_items
GROUP BY sku_id;  -- 这里只按 sku_id 分组

错误信息:

1055 – Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘ry-mall.item.product_id’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

一、错误原因解析

想象你有一盒彩色铅笔(数据库表),里面有:

  • 铅笔型号(sku_id)
  • 铅笔颜色(product_name)
  • 生产批次(product_id)
  • 铅笔图片(pic)

现在老板要求:“按铅笔型号分组,统计每种型号的总数量,同时显示颜色、批次和图片”

问题来了:

  • 同一型号可能有不同颜色(比如型号 A001 有红色和蓝色)
  • 分组后,MySQL 不知道该显示红色还是蓝色
  • 这就是 ONLY_FULL_GROUP_BY 模式的作用 – 防止数据混乱!

核心原因:SELECT 中的列(如 product_name)没有出现在 GROUP BY 中,MySQL 无法确定取哪个值。

二、3 种解决方案(附详细示例)

方案 1:完善 GROUP BY 子句(推荐⭐️⭐️⭐️⭐️⭐️)

SELECT
  product_id,
  product_name,
  pic,
  sp_data,
  SUM(quantity) AS total_sales
FROM order_items
GROUP BY 
  sku_id,          -- 原始分组列
  product_id,      -- 新增
  product_name,    -- 新增
  pic,             -- 新增
  sp_data          -- 新增

优点:

  • 完全符合 SQL 标准;
  • 数据 100%准确;
  • 适合所有 MySQL 版本。

缺点:

GROUP BY 列表较长。

方案 2:使用聚合函数(高效方案⭐️⭐️⭐️⭐️)

SELECT
  MAX(product_id) AS product_id,      -- 使用 MAX 取值
  MAX(product_name) AS product_name,  -- 使用 MAX 取值
  MAX(pic) AS pic,
  MAX(sp_data) AS sp_data,
  SUM(quantity) AS total_sales
FROM order_items
GROUP BY sku_id  -- 只需分组一列

适用场景:

  • 当同一 sku_id 对应的其他列值相同时;
  • 需要优化查询性能时。

重要提示:

  • 如果同一 sku_id 有不同颜色,MAX()会取字母排序最后的颜色(如”蓝色”>“红色”);
  • 使用前需确认业务逻辑是否允许。

方案 3:临时关闭严格模式(应急方案⭐️)

-- 第一步:查看当前模式
SELECT @@sql_mode;

-- 第二步:移除 ONLY_FULL_GROUP_BY
SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

-- 第三步:执行原 SQL
SELECT ... (原始问题语句)

强烈不推荐

  • 可能导致数据随机显示;
  • 每次重连数据库都要重新设置;
  • 生产环境绝对禁止!

三、原问题 SQL 修复完整版

SELECT
  item.product_id,
  item.product_name,
  item.pic,
  item.sp_data,
  SUM(item.quantity) AS total_sales  -- 去掉 IFNULL 更简洁
FROM oms_order_item item
INNER JOIN oms_order o ON o.id = item.order_id  -- 改用 INNER JOIN
WHERE o.STATUS IN (1, 2, 3)
  AND item.create_time >= '2025-07-28 00:00:00'
  AND item.create_time < '2025-07-29 00:00:00'
GROUP BY 
  item.sku_id,
  item.product_id,     -- 关键修复!
  item.product_name,   -- 关键修复!
  item.pic,            -- 关键修复!
  item.sp_data         -- 关键修复!
ORDER BY total_sales DESC
LIMIT 10;

四、预防措施 & 最佳实践

1.设计表结构时

-- 确保 sku_id 能唯一确定商品信息
ALTER TABLE products ADD UNIQUE (sku_id);

2.永久修改 sql_mode(慎重!)

-- 编辑 MySQL 配置文件 my.cnf:
[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

3.开发规范

所有 SELECT 的非聚合列必须出现在 GROUP BY 中

使用别名时特别注意:

SELECT 
  product_id AS id,  -- 别名
  ...
GROUP BY product_id  -- 必须用原始列名!

总结

选择哪种方案?

情况 推荐方案 原因
生产环境 方案 1(完善 GROUP BY) 数据绝对安全
测试环境 方案 2(使用 MAX) 执行更快
紧急调试 方案 3(关闭严格模式) 快速验证

记住这个黄金法则:GROUP BY 中的列,应该能唯一确定 SELECT 中的其他列。遵循这个原则,你将永远告别 1055 错误!

以上关于解决MySQL出现1055错误:ONLY_FULL_GROUP_BY的方法的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。

「点点赞赏,手留余香」

0

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » 解决MySQL出现1055错误:ONLY_FULL_GROUP_BY的方法

发表回复