ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregate

ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregate

大家好,又见面了,我是全栈君。

报错:ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘work_ad.api_community_pic.id’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

字面意思理解是sql_model=only_full_group_by限制了,导致在以往MYSQL版本中能正常查询的SQL,在5.7不能用了
参考文档:
http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sql-mode-setting

文档指出:ONLY_FULL_GROUP_BY的设定,将不允许查询字段包括非聚集列

查询mysql服务器版本:
select @@version
显示:
5.7.10

#查看sql_mode的语法
select @@GLOBAL.sql_mode;
select @@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

only_full_group_by:使用这个就是使用和oracle一样的group 规则, select的列都要在group中,或者本身是聚合列(SUM,AVG,MAX,MIN) 才行,其实这个配置目前个人感觉和distinct差不多的,所以去掉就好

方法一:

查询mysql 1055错误码发现问题为在mysql的配置中如果设置了sql_mode包含ONLY_FULL_GROUP_BY值得话,在进行查询时需要将select的字段都包含在group by 中
即 select x,y from xxx group by x,y
否则就会报错

ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregate

ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregateERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregate

但是查看自己的配置my.cnf发现在sql_mode中并没有ONLY_FULL_GROUP_BY这个值

然后去查看Laravel的配置文件,config/database.php,查找mysql的配置,

'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => env('DB_PREFIX',''),
'strict' => true,
'engine' => null,
],

发现有个strict项,默认为true,上网也没有查找到相关解释,根据字面意思猜测可能为是否开启严格模式,将其修改为false,再次测试发现问题解决,可以输出正确结果
方法二:

#修改sql_mode的语法

通过修改配置文件my.cnf来解决这个问题的。
1. 关闭正在运行的mysql
2. 修改/etc/my.cnf,将sql_mode=中的only_full_group_by给删掉
3. 重启mysql,再执行出错的sql发现能成功执行了

sql_mode解析:
参考自:https://blog.csdn.net/Cooldiok/article/details/59131952

ONLY_FULL_GROUP_BY: 对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP
BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中

NO_AUTO_VALUE_ON_ZERO: 该值影响自增长列的插入。默认设置下,插入0或NULL代表生成下一个自增长值。如果用户
希望插入的值为0,而该列又是自增长的,那么这个选项就有用了。

STRICT_TRANS_TABLES: 在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制
NO_ZERO_IN_DATE: 在严格模式下,不允许日期和月份为零

NO_ZERO_DATE: 设置该值,mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告。

ERROR_FOR_DIVISION_BY_ZERO: 在INSERT或UPDATE过程中,如果数据被零除,则产生错误而非警告。如
果未给出该模式,那么数据被零除时MySQL返回NULL

NO_AUTO_CREATE_USER: 禁止GRANT创建密码为空的用户

NO_ENGINE_SUBSTITUTION:
如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常

PIPES_AS_CONCAT:
将”||”视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似

ANSI_QUOTES: 启用ANSI_QUOTES后,不能用双引号来引用字符串,因为它被解释为识别符

升级MYSQL5.7是为了更好的性能,据我猜测,MYSQL5.7对sql_mode的限制,也是为了更好的查询性能。所以如果在开发阶段,如果要使用mysql5.7版本建议大家阅读一下5.7的文档,然后将自己的sql写的更严谨,尽量少用select * ,只查出自己想要的数据列即可。

由于 我的程序逻辑上只要不同的ip,和最后登录时间,所以 我的SQL改成以下:

SELECT ip,max(last_login)  last_login FROM `sdb_login_log` group by ip;

参考:https://blog.csdn.net/u014520745/article/details/76056170

520sz.com/mysql-5-7-10-group-by-error.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/112076.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • CEGUI渲染概论

    CEGUI渲染概论
    1、几个重要的类
    Direct3D9Renderer负责CEGUI的Render的接口
    RenderingSurface渲染接口类
    RenderingWindow可渲染窗口
    RenderTarget的继承关系相关类。
    Direct3D9GeometryBuffer类
    其方法
     voiddraw()const;//渲染
       voidsetTranslation(constVector3&t);

    2022年7月23日
    20
  • java中使用Jedis操作Redis实例[通俗易懂]

    java中使用Jedis操作Redis实例[通俗易懂]要想在Java中连接Redis,并进行操作,由两种方式,一种是springdataredis,它是由spring集成的,不支持集群,一种是官方推荐的jedis,支持集群,其他功能差不多一样,这里我们介绍jedis操作实例,以下是使用Jedis的具体步骤:1、如果是在Maven项目中,在pom.xml中增加如下语句,如果不是Maven项目下载包导入项目即可:…

    2025年10月13日
    3
  • 两个div并排,左边div固定宽度,右边宽度自适应

    两个div并排,左边div固定宽度,右边宽度自适应

    2021年11月22日
    44
  • linux对外开放端口_如何通过命令开启端口

    linux对外开放端口_如何通过命令开启端口本文目录一、引言二、管理防火墙的命令2.1、开启防火墙2.1.1首先查看防火墙状态2.1.2开启防火墙2.1.3设置开机自启2.1.4重启防火墙2.1.5查看防火墙设置开机自启是否成功2.2、开启特定端口2.2.1添加端口2.2.2重新载入2.2.3查看2.2.4删除2.2.5关闭防火墙2.2.6查看开启的所有端口2.2.7查看服务的监听一、引言在Centos7.x中防火墙由firewalld来管理,以前为了方便,把防火墙都关闭了,因为现在项目

    2025年9月29日
    2
  • 无线通信架构_无线接入网的三层架构

    无线通信架构_无线接入网的三层架构无线通信主要是利用无线电(Radio)射频(RF)技术的通信方式,无线网络是采用无线通信技术实现的网络。无线通信知识架构参考这篇文章——https://blog.csdn.net/zh328271057/article/details/85040145问题在于,无线通信在网络技术方面主要包含无线网络和移动网络(或称为蜂窝移动网络)无线网络可分为两种:近距离无线网络和远距离无线网络,近距离…

    2022年9月21日
    2
  • java基础编程入门教程,2022最新

    java基础编程入门教程,2022最新Java学习到什么程度可以找第一份工作自己买了本Java从入门到精通。以为可以很快地学完,非CS专业。现在我想说所有系列的从入门到精通都是垃圾,一年多来,我每天白天看视频,晚上敲代码到凌晨,我是一个很倔的人,我认为天下没有任何东西是人类学不会的,所以我就付出高三一样的时间去学习。为你解读Java三大框架其实作为Java初学者除了简单的学习框架本身,还需要思考更多的东西,比如有框架和没有框架到底给你带来了什么?用Struts,要充分的理解MVC思想,用Hibernate,要明白什么是持久化,什么是OR/m

    2022年7月9日
    19

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号