SELECT 列表不在 GROUP BY 子句中,并且包含非聚合列 [重复]

Posted

技术标签:

【中文标题】SELECT 列表不在 GROUP BY 子句中,并且包含非聚合列 [重复]【英文标题】:SELECT list is not in GROUP BY clause and contains nonaggregated column [duplicate] 【发布时间】:2016-04-27 01:55:41 【问题描述】:

收到以下错误:

Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'world.country.Code' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

运行以下查询时:

select countrylanguage.language, country.code, sum(country.population*countrylanguage.percentage/100)
from countrylanguage
join country on countrylanguage.countrycode = country.code
group by countrylanguage.language
order by sum(country.population*countrylanguage.percentage) desc ;

使用 mysql 世界测试数据库 (http://dev.mysql.com/doc/index-other.html)。不知道为什么会这样。当前运行 MYSQL 5.7.10。

有什么想法吗??? :O

【问题讨论】:

您启用了ONLY_FULL_GROUP_BY 选项,这消除了MySQL 对GROUP BY 的宽松规则。 MySQL 5.7 中该选项的默认值已更改。 @Barmar 从什么变成什么? @OlleHärstedt 从关闭到打开。 【参考方案1】:

country.code 不在您的 group by 语句中,也不是聚合(包装在聚合函数中)。

https://www.w3schools.com/sql/sql_ref_sqlserver.asp

【讨论】:

链接失效了,请在回答时尝试发布实际内容代替超链接。 这不是关于 SQL Server 的问题。【参考方案2】:

正如@Brian Riley 已经说过的,您应该删除选择中的 1 列

select countrylanguage.language ,sum(country.population*countrylanguage.percentage/100)
from countrylanguage
join country on countrylanguage.countrycode = country.code
group by countrylanguage.language
order by sum(country.population*countrylanguage.percentage) desc ;

或将其添加到您的分组中

select countrylanguage.language, country.code, sum(country.population*countrylanguage.percentage/100)
from countrylanguage
join country on countrylanguage.countrycode = country.code
group by countrylanguage.language, country.code
order by sum(country.population*countrylanguage.percentage) desc ;

【讨论】:

或者直接从mysql命令行运行:SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); 运行但没有效果 我必须在会话中另外设置它:SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

以上是关于SELECT 列表不在 GROUP BY 子句中,并且包含非聚合列 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

#1055 - SELECT 列表的表达式不在 GROUP BY 子句中,并且包含非聚合列,这与 sql_mode=only_full_group_by 不兼容

SQLSTATE [42000]:语法错误或访问冲突:1055 SELECT 列表的表达式 #3 不在 GROUP BY 子句中并且包含非聚合

MySQL 5.0.12 - 列表不在 GROUP BY 子句中并且包含非聚合列?

Doctrine Querybuilder ORDER BY 子句不在 SELECT 列表中

GROUP BY 子句并在查询中包含非聚合列

使用Group By注意事项