错误信息
1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘test_2.t_score.id’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
时间: 0s
示例
CREATE TABLE `t_score` (`id` int NOT NULL AUTO_INCREMENT,`score` int DEFAULT NULL COMMENT '分数',`create_time` varchar(20) COLLATE utf8mb4_bin DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
需求:我有一张打分表,我想按天查询出最高分数的那条数据,包括id
示例数据:
INSERT INTO `t_score` VALUES (1, 5, '2021-09-15');
INSERT INTO `t_score` VALUES (2, 10, '2021-09-15');
INSERT INTO `t_score` VALUES (3, 10, '2021-09-15');
INSERT INTO `t_score` VALUES (4, 15, '2021-09-15');
INSERT INTO `t_score` VALUES (5, 10, '2021-09-16');
INSERT INTO `t_score` VALUES (6, 20, '2021-09-16');
INSERT INTO `t_score` VALUES (7, 15, '2021-09-16');
于是写sql
SELECTcreate_time,max( score )
FROMt_score
GROUP BYcreate_time
如果按天查询出最高成绩,没问题。我的需求是需要把id也查询出来,于是:
报错:错误代码是1055,查询的列表参数1不在group by 子句中,并且包含非聚合列这个表的id;与sql_mode=only_full_group_by不兼容。
原因
这个错误是mysql 5.7.5 版本及以上版本会出现的问题,mysql 5.7.5版本以上默认的sql配置是:sql_mode=“ONLY_FULL_GROUP_BY”,这个配置严格执行了"SQL92标准"。
很多从5.6升级到5.7时,为了语法兼容,大部分都会选择调整sql_mode,使其保持跟5.6一致,为了尽量兼容程序。
由于开启了ONLY_FULL_GROUP_BY的设置,如果select 的字段不在 group by 中,
并且select 的字段未使用聚合函数(SUM,AVG,MAX,MIN等)的话,那么这条sql查询是被mysql认为非法的,会报错误…
如何解决
查询MySQL版本
版本高于5.7.5,所以不兼容。
换一个数据库版本
低于5.7.5,所以可以查询使用。
那总不能直接更换数据库版本吧,有没有解决方案呢。答案:有。
查询sql_mode
select @@global.sql_mode;
去掉ONLY_FULL_GROUP_BY即可
解决
windows修改
因为我的是免安装的MySQL8版本
没有这个文件,在安装目录下新建一个my.ini
内容:
[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
linux修改
vim /etc/my.cnf
最后面增加
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
重启mysql服务
service mysqld restart
再次查询,完成。