Error 1055 错误出现的原因及解决方案

group by经常出现的错误

我们在使用group by给数据库中的表分组的时候经常会遇到这样的问题:
在这里插入图片描述

error 1055出现的原因

ONLY_FUll_GROUP_BY的意思是:对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY语句中,也就是说查出来的列必须是GROUP BY之后的字段,或者这个字段出现在聚合函数里面。

group by 出现错误的解决方法

1、使用ANY_VALUE()函数

select age,any_value(name) from person group by age

2、修改mysql配置my.cnf(windows下面是my.ini),删除only_full_group_by属性,
下面我们通过命令行通过命令进行修改

SELECT @@GLOBAL.sql_mode;

把查询出来的sql_mode中的only_full_group_by删除重新set sql_model = xxxx即可,然后重新启动mysql服务

出现的问题

测试数据库中的数据
Error 1055 错误出现的原因及解决方案_第1张图片
然后呢
Error 1055 错误出现的原因及解决方案_第2张图片
此时查询不会报错,然而,看看就会发现我库里数据banji分别是‘五班’,‘六班’,‘七班’,这里BITceshi分组分为两组后BITceshi = 0对应着’五班’,’六班’两个值,而数据库查出来的是只显示五班

数据库查询显示的数据是默认id升序显示的,所以默认正序显示了五班

存在的问题

那么问题来了,如果banji 和BIT测试的对应关系不是一对一就会在业务中出现两个问题

  • 多次显示的banji的值不同
  • 需要显示的banji值不对

总结

所以对于上面的那种情况如果你现在表数据里面两个需要显示的字段的关系是一对一关系就可以使用上面两种方法解决这个group by error,如果group by字段是一对多的就得谨慎使用

Group By正确的用法

myql的group by语法为:
select 选取分组中的列 + 聚合函数 from 表名称 group by 分组的列
从语法格式来看,是现有分组,在确定检索的列,检索的列只能是参加分组了的列。
所以问题中,group by 后的a,b,c是先确定的,而select 后面的字段是可变的
正确的语句

select a,b,c from table_name group by a,b,c,d;
select a,b from table_name group by a,b,c;
select a,max(a) from table_name group by a,b,c;

你可能感兴趣的:(mysql,数据库,mysql,sql)