📌  相关文章
📜  mysql 表达式不在 group by 子句中 (1)

📅  最后修改于: 2023-12-03 15:33:03.819000             🧑  作者: Mango

MySQL表达式不在GROUP BY子句中

在MySQL中,当我们使用GROUP BY语句对结果集分组时,如果SELECT语句中的表达式没有在GROUP BY子句中出现,就会报错"Expression #N of SELECT list is not in GROUP BY clause and contains nonaggregated column 'xxx' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by"。

这个错误是由于MySQL默认启用了ONLY_FULL_GROUP_BY模式导致的。在这种模式下,如果SELECT语句中的表达式没有在GROUP BY子句中出现,就会报错。这种做法是为了保证查询结果的正确性。

解决这个问题有两种方式:

1. 在GROUP BY子句中添加表达式

可以将SELECT语句中的表达式都添加到GROUP BY子句中。例如,我们有一个表students,其中包含id、name和age字段,我们想按age字段分组,计算每个年龄段的学生数。下面是一个错误的SELECT语句:

SELECT age, count(*) FROM students GROUP BY age;

这个语句会报错,因为SELECT语句中的count(*)表达式没有在GROUP BY子句中出现。我们可以将它添加到GROUP BY子句中:

SELECT age, count(*) FROM students GROUP BY age, count(*);

这个语句就可以正确执行了。

2. 关闭ONLY_FULL_GROUP_BY模式

如果不想在GROUP BY子句中添加表达式,可以将ONLY_FULL_GROUP_BY模式关闭。关闭这个模式可能会导致查询结果不准确,因此应该慎重使用。

可以通过修改MySQL的配置文件my.cnf来关闭这个模式。找到my.cnf文件,如果不存在就创建一个,添加如下配置:

[mysqld]
sql_mode = "STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

重启MySQL服务,这个模式就会被关闭了。

在关闭这个模式之后,我们之前错误的SELECT语句就可以正确执行了:

SELECT age, count(*) FROM students GROUP BY age;

这个语句会计算每个年龄段的学生数,并且不会报错了。

总之,在使用GROUP BY语句时一定要注意表达式是否都在GROUP BY子句中出现,否则就会报错。如果需要使用一些比较复杂的表达式,可以考虑使用子查询或者视图来避免这个问题。