关于mysql5.7.28版本遇到ONLY_FULL_GROUP
2019-12-03 本文已影响0人
yunqing_71
首先出现这个问题的情景:
某年月日,领导给我一段数据库sql执行文件,让我放在本地开发调试,我本地用的mysql8.0,开发过程中遇到一个表的字段使用了mysql关键字function,查询的时候用到了mybatis的Example条件查询,首先不能改字段名、其次我在mapper.xml中的关键字改成function
,还是不能解决,因为有一段Example的sql代码如下:
<sql id="Example_Where_Clause" >
<where >
<foreach collection="oredCriteria" item="criteria" separator="or" >
<if test="criteria.valid" >
<trim prefix="(" suffix=")" prefixOverrides="and" >
<foreach collection="criteria.criteria" item="criterion" >
<choose >
<when test="criterion.noValue" >
and ${criterion.condition}
</when>
<when test="criterion.singleValue" >
and ${criterion.condition} #{criterion.value}
</when>
<when test="criterion.betweenValue" >
and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
</when>
<when test="criterion.listValue" >
and ${criterion.condition}
<foreach collection="criterion.value" item="listItem" open="(" close=")" separator="," >
#{listItem}
</foreach>
</when>
</choose>
</foreach>
</trim>
</if>
</foreach>
</where>
</sql>
查询的时候include refid了上面这段动态sql,所以万般求索不得解的情况下,又在本地安装了mysql5.7.28版本。
安装过程省略。。。
安装之后遇到错误如下
Expression #1 of ORDER BY clause is not in GROUP BY clause and
经查,原因如下:
mysql 5.7.5版本开始,默认的sql_mode是有ONLY_FULL_GROUP_BY的,也就是说,你查询的字段必须都得存在于group by后面,否则就会报错。修改mysql的sql_mode就可以完美的解决这个问题。5.7版本看来还是太高了。。
解决办法:
1.打开命令行,进入数据库
mysql -uroot -p
2.查询数据库版本和sql_mode,可以看到是包含ONLY_FULL_GROUP_BY的。
select version(),@@global.sql_mode;
3.修改sql_mode去掉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';
如下图,我已经修改完了再次查询,没有了ONLY_FULL_GROUP_BY问题解决。
image.png
4.领导要求保留mysql5.7的这个默认的强sql规则,所以恢复此模式的方法
set 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'
set session 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'
select @@sql_mode;
5.遵守该特性的情况下怎么查询非group by 包裹和非聚合函数的字段?
#答案就是用any_value()包裹此字段
any_value(t1.name)