SQL错误1055求助:SELECT字段未在GROUP BY且不满足函数依赖
问题解决:MySQL 1055 错误
原SQL语句
select countrycode,name, max(population) from city group by CountryCode LIMIT 0, 1000
错误信息
错误代码: 1055。SELECT列表中的表达式#2不在GROUP BY子句中,且包含非聚合列'world.city.Name',该列不依赖于GROUP BY子句中的列;这与sql_mode=only_full_group_by不兼容 0.000秒
原因
MySQL开启only_full_group_by模式时,要求SELECT语句中的非聚合列必须出现在GROUP BY子句中,或者与GROUP BY的列存在函数依赖(比如主键列和其他列的关联)。原语句中name既不在GROUP BY里,且一个国家对应多个城市名,与countrycode无函数依赖,因此触发报错。
解决方案
方案1:获取每个国家人口最多的城市完整信息(推荐)
通过子查询先找出每个国家的最大人口,再关联原表匹配对应的城市:
SELECT c.countrycode, c.name, c.population FROM city c INNER JOIN ( SELECT countrycode, MAX(population) AS max_pop FROM city GROUP BY countrycode ) t ON c.countrycode = t.countrycode AND c.population = t.max_pop LIMIT 0, 1000;
方案2:保留原结构,使用聚合函数包裹非聚合列
如果不需要name对应最大人口的城市,只是想显示任意一个城市名,可以用ANY_VALUE()函数忽略函数依赖检查:
select countrycode, ANY_VALUE(name), max(population) from city group by CountryCode LIMIT 0, 1000;
方案3:临时关闭only_full_group_by模式(不推荐)
此方法会违反SQL标准,可能导致结果不可预期,仅临时测试时使用:
SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
内容的提问来源于stack exchange,提问作者arihant singh
相关产品推荐
相关产品推荐

