在MySQL 5.7及以上版本中,当启用only_full_group_by模式时,如何编写GROUP BY查询以避免'Expression#1 of ORDER BY clause is not in GROUP BY clause'等错误?
时间: 2024-11-02 10:17:31 浏览: 39
启用only_full_group_by模式后,编写GROUP BY查询需要特别注意哪些字段参与了聚合,哪些没有。在你遇到错误提示如'[Err]1055 - Expression#1 of ORDER BY clause is not in GROUP BY clause and contains non-aggregated column'时,需要对查询语句进行修改,以确保所有非聚合字段要么在GROUP BY子句中明确指出,要么通过使用`any_value()`函数来处理。
参考资源链接:[MySQL 5.7 only_full_group_by模式详解与解决方案](https://wenku.csdn.net/doc/6412b5c6be7fbd1778d44593?spm=1055.2569.3001.10343)
首先,确认当前的sql_mode设置是否包含了only_full_group_by:
```
SELECT @@global.sql_mode;
```
如果发现only_full_group_by在sql_mode中,你可以选择将其暂时禁用:
```
SET global sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
```
或者临时性地:
```
SET sql_mode = '...';
```
然后,对你的GROUP BY查询进行调整。确保所有非聚合字段要么被排除在SELECT子句之外,要么使用any_value()函数来处理。例如:
```sql
SELECT
column1,
column2,
any_value(column3)
FROM
table_name
GROUP BY
column1,
column2;
```
在这个例子中,column1和column2是参与分组的字段,而column3没有直接参与分组,因此使用了any_value()函数。这样做可以确保查询不会因为only_full_group_by模式而报错。
在处理ORDER BY子句时,同样需要保证ORDER BY中的表达式要么是GROUP BY子句中包含的字段,要么在SELECT子句中明确通过聚合函数处理,比如COUNT()、MAX()或SUM()等。
通过这些步骤,你可以在启用only_full_group_by模式下,有效地执行GROUP BY查询并避免常见的错误。尽管这种模式带来了额外的限制,但通过合理使用any_value()函数和遵循SQL标准,你仍然可以编写出既安全又高效的SQL查询。若希望深入学习更多关于SQL_mode的设置及其对查询的影响,可以查看《MySQL 5.7 only_full_group_by模式详解与解决方案》。这份资料将为你提供更全面的视角和解决方案,帮助你更全面地理解和应用这些规则。
参考资源链接:[MySQL 5.7 only_full_group_by模式详解与解决方案](https://wenku.csdn.net/doc/6412b5c6be7fbd1778d44593?spm=1055.2569.3001.10343)
阅读全文