在使用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 by
和distanct
一样,是去重查询,不够严谨。
所以个人建议使用方式三去避免这个错误,而不是修改sql_mode模式。