MySQL中SELECT列表不在GROUP BY子句中且包含非聚合列….与sql_mode=only_full_group_by不兼容

MySQL中SELECT列表不在GROUP BY子句中且包含非聚合列….与sql_mode=only_full_group_by不兼容

在进行MySQL查询时,经常会遇到这样的错误提示:

“SELECT list is not in GROUP BY clause and contains nonaggregated column …. incompatible with sql_mode=only_full_group_by”

这个错误提示的意思是SELECT列表不在GROUP BY子句中且包含非聚合列,在sql_mode设置为only_full_group_by时是不允许的。这种情况通常发生在对表进行聚合查询时,例如对某列进行SUM、AVG、MAX等统计操作。

针对这个问题,我们可以采取以下几个方法进行解决:

阅读更多:MySQL 教程

1. 将没有出现在GROUP BY子句中的列使用聚合函数进行处理

比如,在下面的示例中,我们想要对名字进行分组,但同时需要计算这些人的年龄之和。此时,如果直接写”SELECT name, age”的话,就会报错。这时候,我们可以使用SUM()函数对年龄进行聚合处理,例如:

SELECT name, SUM(age)
FROM person
GROUP BY name;
Mysql

2. 将sql_mode设置为非only_full_group_by模式

在MySQL中,有多种sql_mode,only_full_group_by是其中之一。只要将sql_mode设置为和only_full_group_by不同的模式,就可以避免这个问题。常见的比如:

将sql_mode设置为ANSI:

SET sql_mode=ANSI;
Mysql

将sql_mode设置为空:

SET sql_mode='';
Mysql

3. 对非聚合列进行限制

如果我们真的需要在SELECT列表中包含非聚合列,并且不想改变sql_mode的设置,我们也可以对非聚合列进行限制,例如:

SELECT name, MAX(age)
FROM person
GROUP BY name
HAVING COUNT(*) > 1;
Mysql

在这个示例中,我们只返回那些在分组中至少出现了两次的人的名字和最大年龄,这样就避免了只出现在SELECT列表中的非聚合列出现在GROUP BY子句之外的问题。

总结

当SELECT列表不在GROUP BY子句中且包含非聚合列时,如果sql_mode设置为only_full_group_by,就会报错。这种情况下,我们可以采取上述的三种方法来解决问题。需要根据具体情况选择最合适的方法。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册