MySQL出现1055错误:ONLY_FULL_GROUP_BY的问题解决

 更新时间:2025年07月29日 08:21:04   作者:一勺菠萝丶  
当你执行SQL查询时突然遇到"1055 - Expression #1 of SELECT list is not in GROUP BY clause…"错误,该怎么办呢,下面小编就来和大家简单讲讲吧

当你执行SQL查询时突然遇到"1055 - Expression #1 of SELECT list is not in GROUP BY clause…"错误,是不是一脸懵?别担心!这篇文章将用最简单的语言解释这个MySQL 8.0常见错误的原因和解决方案,即使你是SQL小白也能轻松搞定!

错误重现:典型的报错场景

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的问题解决的文章就介绍到这了,更多相关MySQL 1055错误解决内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈MySql的存储引擎(表类型)

    浅谈MySql的存储引擎(表类型)

    通常意义上,数据库也就是数据的集合,具体到计算机上数据库可以是存储器上一些文件的集合或者一些内存数据的集合
    2011-05-05
  • MySQL参数优化信息参考(my.cnf参数优化)

    MySQL参数优化信息参考(my.cnf参数优化)

    下面针对一些参数进行说明,当然还有其它的设置可以起作用,取决于你的负载或硬件:在慢内存和快磁盘、高并发和写密集型负载情况下,你将需要特殊的调整
    2024-07-07
  • mysql事件的开启和调用

    mysql事件的开启和调用

    这篇文章主要介绍了mysql事件的开启和调用,需要的朋友可以参考下
    2015-01-01
  • 简单聊一聊SQL中的union和union all

    简单聊一聊SQL中的union和union all

    在写SQL的时候,偶尔会用到两个表的数据结合在一起返回的,就需要用到UNION 和 UNION ALL,这篇文章主要给大家介绍了关于SQL中union和union all的相关资料,需要的朋友可以参考下
    2023-02-02
  • mysql中insert与select的嵌套使用解决组合字段插入问题

    mysql中insert与select的嵌套使用解决组合字段插入问题

    本节主要介绍了mysql中insert与select的嵌套使用解决组合字段插入问题,需要的朋友可以参考下
    2014-07-07
  • 安装MySQL常见的三种方式

    安装MySQL常见的三种方式

    MySQL是一个开放源码的小型关联式数据库管理系统,被广泛地应用在Internet上的中小型网站中。接下来通过本篇文章给大家分享安装MySQL常见的三种方式,需要的朋友可以参考下
    2015-09-09
  • mysql between实现选取介于两个值之间的数据范围

    mysql between实现选取介于两个值之间的数据范围

    这篇文章主要介绍了mysql between实现选取介于两个值之间的数据范围,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • MySQL中的悲观锁与乐观锁

    MySQL中的悲观锁与乐观锁

    这篇文章主要介绍了MySQL中悲观锁与乐观锁的相关资料,帮助大家更好的理解和学习MySQL数据库,感兴趣的朋友可以了解下
    2020-09-09
  • 你的like语句为什么没索引详解

    你的like语句为什么没索引详解

    这篇文章主要给大家介绍了关于你的like语句为什么没索引的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用mysql具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-10-10
  • Window Docker 安装MySQL8.0的过程详解

    Window Docker 安装MySQL8.0的过程详解

    本文给大家介绍在Windows环境下安装Docker并配置MySQL容器的全流程介绍,过程中还涉及到文件映射和客户端连接MySQL的操作,感兴趣的朋友跟随小编一起看看吧
    2024-11-11

最新评论