mysql5.7+的版本默认是开启了 only_full_group_by
模式的,开启这个模式后,查询的列必须都是分组的条件。原先的 group by 语句会报这个错误。
查看sql_mode
select @@global.sql_mode;
结果:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
可以看到,第一个就是 only_full_group_by
解决方法
1:去掉ONLY_FULL_GROUP_BY
,重新设置值。
set @@global.sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
2:any_value()函数的使用
SELECT
any_value (ID) AS ID,
any_value(PIC_TYPE),
PIC_NAME
FROM
`cp_picname_mapping` g
GROUP BY
g.PIC_NAME
介绍一下GROUP_CONCAT()函数。
作用:分组完成后,相同的列放在一起
select GROUP_CONCAT(
s.name SEPARATOR ';'
) as names FROM student s GROUP BY s.class_id
把学生按班级分组,所有名字取出来组成names,每个学生姓名用;
号分割。
select GROUP_CONCAT(
CONCAT(age,':'),
s.name SEPARATOR ';'
) FROM student s GROUP BY s.class_id
跟上面的查询比,多了个CONCAT()
函数,把每个学生的年龄和姓名放一块,用:
分割,多个用;
号分割。