📅  最后修改于: 2023-12-03 15:33:03.819000             🧑  作者: Mango
在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子句中出现,就会报错。这种做法是为了保证查询结果的正确性。
解决这个问题有两种方式:
可以将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(*);
这个语句就可以正确执行了。
如果不想在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子句中出现,否则就会报错。如果需要使用一些比较复杂的表达式,可以考虑使用子查询或者视图来避免这个问题。