mysql Error 1055: Expression #1 of ORDER BY clause is not in GROUP BY ...

本文介绍了解决MySQL中Error1055错误的方法,该错误与sql_mode设置有关。文章提供了两种解决方案:一是临时修改sql_mode;二是通过配置文件进行永久修改。

一:背景

Error 1055: Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'leyangjun_db.order.pay_at' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

二:原因

主要是数据库版本的问题

三:解决

查看命令:select @@sql_mode;

1:临时解决(机器重启后就会失效)

直接客户端指定命令:set global sql_mode='';

2:修改配置永久生效

修改 my.cnf 文件的 sql_mode,修改完配置记得重启MySQL

<think>我们正在解决SQL错误 [1055] [42000]:ORDER BY子句中的表达式不在GROUP BY子句中且包含非聚合列,与sql_mode=only_full_group_by不兼容的问题。 这个问题通常发生在MySQL 5.7及以上版本,因为默认的sql_mode包含了ONLY_FULL_GROUP_BY,它要求SELECT语句中出现在GROUP BY子句外的非聚合列必须出现在GROUP BY子句中,或者被聚合函数包裹。 解决方案通常有以下几种: 1. 修改SQL查询语句,使其符合ONLY_FULL_GROUP_BY规则。这可能包括: - 将所有在SELECT、HAVING或ORDER BY子句中出现的非聚合列都添加到GROUP BY子句中。 - 使用聚合函数(如MAX(), MIN(), AVG()等)包裹非聚合列。 - 使用ANY_VALUE()函数包裹非聚合列(MySQL 5.7及以上版本支持)。 2. 修改sql_mode,移除ONLY_FULL_GROUP_BY选项。但这可能会降低数据的一致性和可靠性,因为允许在GROUP BY查询中非聚合列不明确。 3. 在应用程序中设置sql_mode,或者在MySQL配置文件中永久修改。 下面我们详细说明每种方法: 方法1:修改查询语句 示例:原始查询可能类似于: SELECT a, b, c FROM table GROUP BY a; ORDER BY b; 错误原因:在GROUP BY子句中只包含了列a,但在SELECT子句中选择了b和c(非聚合且在GROUP BY中未出现),并且在ORDER BY中使用了b(同样未在GROUP BY中且非聚合)。 修正方式1:将所有非聚合列都加入到GROUP BY子句: SELECT a, b, c FROM table GROUP BY a, b, c ORDER BY b; 修正方式2:如果你确定每个分组内的b和c的值都是相同的,或者你只关心每个分组中的其中一个值,可以使用聚合函数或ANY_VALUE(): SELECT a, ANY_VALUE(b) as b, MAX(c) as c FROM table GROUP BY a ORDER BY ANY_VALUE(b); 方法2:临时修改sql_mode(仅对当前会话有效) SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,&#39;ONLY_FULL_GROUP_BY&#39;,&#39;&#39;)); 方法3:永久修改sql_mode(需重启MySQL或修改配置文件) - 打开MySQL配置文件(如my.cnf或my.ini) - 在[mysqld]部分添加或修改: sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION - 注意:以上sql_mode的值根据MySQL版本和你的需求可能不同,你可以通过`SELECT @@sql_mode;`查看当前设置,然后去掉ONLY_FULL_GROUP_BY。 方法4:在应用程序的连接初始化时设置(例如在连接字符串中设置,或者连接后执行SET命令)。 注意:移除ONLY_FULL_GROUP_BY可能会导致查询结果不明确,因为同一个分组内非聚合列可能有多个值,而MySQL会任意选择一个值返回,这可能会导致不可预期的结果。因此,建议优先考虑修改查询语句。 根据你的具体查询,选择合适的方法。如果你能提供具体的SQL查询语句,我们可以给出更具体的修改建议。 相关问题: 1. 如何查看当前的sql_mode设置? 2.MySQL 8.0中,解决ONLY_FULL_GROUP_BY错误的方法有什么区别? 3. 除了ANY_VALUE(),还有哪些函数可以处理非聚合列? 4. 为什么MySQL要引入ONLY_FULL_GROUP_BY模式? </think>### SQL错误1055(42000):解决方案详解 该错误发生在MySQL 5.7+版本中,当`sql_mode`包含`ONLY_FULL_GROUP_BY`时(默认启用),表示GROUP BY查询必须满足严格模式规范。以下是系统级解决方案: #### 方法1:修改SQL查询(推荐) ```sql -- 方案A:添加缺失字段到GROUP BY SELECT department, employee_name, MAX(salary) FROM employees GROUP BY department, employee_name -- 确保ORDER BY字段在GROUP BYORDER BY employee_name; -- 方案B:使用聚合函数包裹非聚合列 SELECT department, MAX(employee_name) AS last_employee, AVG(salary) FROM employees GROUP BY department ORDER BY MAX(employee_name); -- 用聚合函数包裹ORDER BY字段 -- 方案C:使用ANY_VALUE()(MySQL 5.7+) SELECT department, ANY_VALUE(employee_name), SUM(salary) FROM employees GROUP BY department ORDER BY ANY_VALUE(employee_name); -- 明确忽略值唯一性检查 ``` #### 方法2:修改会话级sql_mode(临时生效) ```sql -- 查询当前模式 SELECT @@SESSION.sql_mode; -- 移除ONLY_FULL_GROUP_BY(当前会话有效) SET SESSION sql_mode = &#39;STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION&#39;; ``` #### 方法3:修改全局配置(永久生效) 1. 编辑MySQL配置文件(`my.cnf`或`my.ini`): ```ini [mysqld] sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION" ``` 2. 重启MySQL服务: ```bash sudo systemctl restart mysql ``` #### 错误根本原因 当`ONLY_FULL_GROUP_BY`启用时,所有`SELECT`、`HAVING`和`ORDER BY`中的非聚合列必须: 1. 出现在`GROUP BY`子句中,或 2. 被聚合函数包裹(如`MAX()`、`ANY_VALUE()`)[^1] > ⚠️ 警告:禁用`ONLY_FULL_GROUP_BY`可能导致不可预测的查询结果,优先推荐修改查询语句。 --- ### 相关问题 1. 如何在MySQL 8.0中精确控制`sql_mode`的继承规则? 2. `ANY_VALUE()`和`MAX()`在解决此类错误时的性能差异是什么? 3. PostgreSQL的`GROUP BY`处理与MySQL的`ONLY_FULL_GROUP_BY`有何本质区别? 4. 如何通过SQL审计工具自动检测违反`ONLY_FULL_GROUP_BY`的查询? [^1]: 参见MySQL官方文档:[GROUP BY Handling](https://dev.mysql.com/doc/refman/8.0/en/group-by-handling.html)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值