当前位置: 代码迷 >> 综合 >> SQL 错误 [1055] [42000]: Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggreg
  详细解决方案

SQL 错误 [1055] [42000]: Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggreg

热度:24   发布时间:2023-12-11 16:20:38.0

在使用group by时,报错信息如下:
在这里插入图片描述
ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'mome.a.type' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

mysql5.6中默认的sql_mode是宽松模式,即`NO_ENGINE_SUBSTITUTION`,
mysql5.7中默认的sql_mode是严格模式,即`STRICT_TRANS_TABLES`。

这个问题我出现的原因是mysql版本是5.7.x,5.7版本以上是默认开启了 only_full_group_by 严格模式,此模式下group by 只能获取受到其影响的字段信息,无法和其他未受其影响的字段共存。

首先通过SQL查询全局sql_mode模式:

 select @@global.sql_mode;

在这里插入图片描述
发现已开启开启only_full_group_by 模式,我们可以通过如下方式修改:
方式一:

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';

在这里插入图片描述
查询显示修改成功,重新连接,再次使用group by,成功查询。
在这里插入图片描述

方式二:
修改mysql配置文件:
sudo vim /etc/my.cnf
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

重启mysql服务,再次使用,查询成功。
在这里插入图片描述

方式三:
通过ANY_VALUE()函数,非分组字段的出现(和关闭 only_full_group_by 模式有相同效果)

select ANY_VALUE(XXX1),XXX2,COUNT(XXX3) from TABLE  GROUP BY XXX2;

在这里插入图片描述

但是个人认为only_full_group_by 模式开启比较好,因为不开启的话,当不加函数时,group bydistanct一样,是去重查询,不够严谨。

所以个人建议使用方式三去避免这个错误,而不是修改sql_mode模式。

  相关解决方案