关于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)
上一篇下一篇

猜你喜欢

热点阅读