MySQL提示:1055 (42000): SELECT list is not in GROUP BY clause and contains nonaggregated column

问题现象

在执行MySQL命令进行查询时,提示如下错误:

1055(42000): SELECT list is not in GROUP BY clause and contains nonaggregated column

原因与解决方案

该报错主要是因为sql_mode参数被修改导致:

原因一:用户修改sql_mode参数导致GROUP BY的语法不合规

  • 原因:用户修改了sql_mode参数,加上了ONLY_FULL_GROUP_BY条件,导致GROUP BY的语法不符合规范。

  • 解决方案:登录RDS控制台,选择地域与实例,在实例详情页的参数设置页面,修改sql_mode参数取值,去掉ONLY_FULL_GROUP_BY条件,忽略GROUP BY的严格检查。修改方法,请参见设置实例参数

原因二:业务侧驱动程序修改sql_mode参数导致GROUP BY报错

  • 原因:业务侧使用的驱动程序修改了sql_mode参数值。例如,业务侧使用的ADO.NET驱动程序修改了sql_mode参数值,导致GROUP BY报错。现象如上图所示,当执行的INSERT语句需要返回自增列的值时,驱动程序会在执行INSERT语句前,自动修改当前会话上的sql_mode参数值,并且不会在INSERT语句执行完之后将sql_mode恢复为原参数值。如果当前会话被继续使用,会导致后续执行包含GROUP BYSELECT语句时出现报错。

  • 解决方案:如果使用了ADO.NET驱动程序,需要用户在驱动程序执行INSERT语句之后且执行查询之前,在业务侧代码中,增加修改sql_mode参数的语句(代码如下),将sql_mode参数修改为默认值。

    SET session sql_mode = default;