下面是详细的攻略。
问题背景
MySQL中的sql_mode
是一个很重要的参数,一般情况下,我们建议使用 sql_mode=strict_trans_tables
,这样可以强制 MySQL 严格执行 SQL 标准。但是,在某些情况下,应用程序可能需要更灵活的 sql_mode
,因为开启了某些 SQL 模式可能会导致一些误报/报错的情况。
这里我们主要介绍一种情况,就是当我们的 SQL 查询语句中含有 GROUP BY
的时候,MySQL 会默认开启 sql_mode=only_full_group_by
模式,这种模式会禁止在 SELECT
中出现未被 GROUP BY
的列。如果我们的查询不符合这个规则的话,MySQL 会抛出如下的报错信息:
ERROR 1055 (42000): Expression #x of SELECT list is not in GROUP BY clause and contains nonaggregated column...
这个报错信息表示,SELECT
中的某个列不符合 only_full_group_by
模式的条件。那么如何解决这个问题呢?
解决方案
现在介绍4种可行的解决方法:
方法一:升级MySQL版本
自MySQL 5.7.5以后,ONLY_FULL_GROUP_BY
模式已成为MySQL默认设置,通过升级MySQL可以解决该问题。
方法二:关闭ONLY_FULL_GROUP_BY模式
关闭ONLY_FULL_GROUP_BY模式,这个方法相对简单,虽然不推荐使用,但在某些特定的情境下可以使用:
set session sql_mode="STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";
方法三:使用MySQL非标准SQL语法
在查询中,使用非标准的SQL语法可以解决这个问题,也是一个比较常见的方式。具体做法是在SELECT
中加入ANY_VALUE
,如下所示:
SELECT column1, ANY_VALUE(column2),column3...
FROM table
GROUP BY column1
这样,在查询结果中,我们会得到column2
的一个值而不会抛出报错信息,也不会影响查询结果的正确性。
方法四:将所有列都加入GROUP BY中
将所有列都加入GROUP BY
中,这是一种最严格的方式,也是最常见的解决方案之一。具体做法是在GROUP BY
中添加所有的列:
SELECT column1,column2,column3...
FROM table
GROUP BY column1,column2,column3...
以上就是本文介绍的解决MySQL报错: sql_mode=only_full_group_by
的4种方案,其中第二种方案应该限制在一定范围内使用,其他方案都可以考虑尝试。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL报错:sql_mode=only_full_group_by的4种轻松解决方法(含举例) - Python技术站