最近开发过程中遇到了only_full_group_by这个坑,所以写篇文章记录一下。
在MySQL5.7中是默认开启ONLY_FULL_GROUP_BY,ONLY_FULL_GROUP_BY是MySQL提供的一个sql_mode,通过这个sql_mode来提供SQL语句GROUP BY合法性的检查,在MySQL的sql_mode是非ONLY_FULL_GROUP_BY语义时。一条select语句,MySQL允许target list中输出的表达式是除聚集函数或group by column以外的表达式,这个表达式的值可能在经过group by操作后变成undefined,例如:
CREATE TABLE a
(
id
int(11) DEFAULT NULL,
name
varchar(255) DEFAULT NULL,
sex
char(1) DEFAULT NULL,
age
int(11) DEFAULT NULL,
subject
varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO a
VALUES (‘1’, ‘张三’, ‘男’, ‘18’, ‘语文’);
INSERT INTO a
VALUES (‘2’, ‘李四’, ‘男’, ‘19’, ‘语文’);
INSERT INTO a
VALUES (‘2’, ‘李四’, ‘男’, ‘19’, ‘数学’);
INSERT INTO a
VALUES (‘3’, ‘小红1’, ‘女’, ‘20’, ‘英语’);
INSERT INTO a
VALUES (‘3’, ‘小红2’, ‘女’, ‘20’, ‘语文’);
执行
SELECT id,nmae FROM a
GROUP BY id;
会出现错误如下:
[Err] 1054 - Unknown column ‘nmae’ in ‘field list’
或者
Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘database_tl.emp.id’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by 。。。
原因是,再使用group by时,select后面的列必须是包含在聚合函数或 GROUP BY 子句中。
所以解决办法是
第一种是使用聚合函数
SELECT id,GROUP_CONCAT(DISTINCT name) FROM a
GROUP BY id;
而使用再GROUP BY后面所查询的结果会有所不一样,所以只作为记录
SELECT id,name FROM a
GROUP BY id,name;
第二种办法就是配置mysql
使用命令
set @@GLOBAL.sql_mode=’’
去除了only_full_group_by这个之后,mysql执行SELECT id,name FROM a
GROUP BY id;就不会报错了
mysql的only_full_group_by的坑
最新推荐文章于 2023-10-12 11:53:18 发布