本文源自于这个报错:

image.png

  1. MySQL> SELECT id, name FROM t1 GROUP BY name;
  2. ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.t1.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

查阅相关资料:

官网手册来看,MySQL5.7.5版本开始的 sql_mode 中默认包含ONLY_FULL_GROUP_BY配置

:::info 可以用 SELECT @@GLOBAL.SQL_MODE 查询一下当前 sql_mode 的结果(如图1所示) ::: image.png
图1:sql_mode

ONLY_FULL_GROUP_BY配置会对 GROUP BY 用法做检查:

  • 当查询的某个字段不在分组字段时会报错(如图2所示)
  • e.g. SELECT id, name FROM t1 GROUP BY name

image.png
图2:GROUP BY 报错

报错原因分析:

  • 首先, sql_mode 开启了ONLY_FULL_GROUP_BY检测
  • 查询的字段列表(select list)中 id 是不在分组字段列表内(group list)的

解决方案一:

  • 给不在分组内的查询字段加上 any_value()
  • e.g. SELECT any_value(id) as id, name FROM t1 GROUP BY name

image.png

解决方案二:

  • ONLY_FULL_GROUP_BYsql_mode 中移除:
    1. SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
    image.png :::tips 注意:设置完成后立即查询仍然会报错,是因为本次登录的缓存原因,断开重连后再试就生效了。 ::: image.png