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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • android之LayoutInflater详解_什么是LayoutInflater

    作用:LayoutInflater作用是将layout的xml布局文件实例化为View类对象 对于常见的一个已经载入的Activity, 我们可以使用findViewById方法来获得其中的界面元素. 而对于一个没有被载入或者想要动态载入的界面, 就需要使用inflate来载入了. 方法:    Android里面想要创建一个画面的时候, 初学一般都是新建一个类, 继承Acti

  • 无人机超远距离WiFi传输,CV5200无线通信模组,无线音视频传输方案「建议收藏」

    无人机超远距离WiFi传输,CV5200无线通信模组,无线音视频传输方案「建议收藏」在绝大多数任务场合都需要在远离现场的情况下,实时、可靠的观察或获取现场图像及视频,而此时无人机图传系统就会显现出它的重要作用。什么是无人机图传呢?将现场无人机所搭载的摄像机拍摄到的视频以无线方式实时传送到远距离后方的一种无线电子传输产品。因此无人机图传也被称为无人机的“眼睛”。智能cv5200双向无线通信系统,基于802.11无线通信标准,采用自身开发的LR-WiFi(远距离WiFi)私有协议,具备ML,MRC,LDPC,MIMO-OFDM等高级无线技术。具有传输距离远、可组网、抗干扰性强、

  • oracle报未明确定义列_oracle视图创建

    oracle报未明确定义列_oracle视图创建报这个错误的原因在于选出的结果集中包含相同的字段,数据库不知道应该以哪个字段为准。selectU.*from(selectq.jslongitude_gpsas**gpslatitude**,q.jslatitude_gpsas**gpslatitude**,q.jslongitude_amapaslontitude,q.jslatitude_amapasla

  • linux下卸载软件命令行,如何使用Linux中的命令行卸载软件 | MOS86「建议收藏」

    linux下卸载软件命令行,如何使用Linux中的命令行卸载软件 | MOS86「建议收藏」Linux提供了不同的安装软件的方法。您可以使用Ubuntu软件中心从标准Ubuntu软件仓库外部或通过编译源代码安装来自标准Ubuntu软件仓库的软件。但是,如果你需要卸载程序怎么办?如果您使用Ubuntu软件中心从Ubuntu软件仓库安装了软件,您可以使用Ubuntu软件中心来卸载该软件。但是,如果您使用命令行更加舒适,我们将向您显示一个简单的方法来查看系统上安装的内容并卸载程序。相关文章图片…

  • Vue(3)webstorm代码格式规范设置与vue模板配置

    Vue(3)webstorm代码格式规范设置与vue模板配置编译器代码格式规范设置通常我们写代码时,代码缩进都是4个空格,但是在前端中,据全球投票统计,建议使用2个空格来进行代码缩进。首先我们打开webstorm中的设置,如果使用的是mac的同学直接使用c

  • 中国成功发射第二颗北斗导航卫星,有感

    中国成功发射第二颗北斗导航卫星,有感首先,听到这个是心情很激动,觉得祖国离强国的距离又近一步。但又在想何时我想的卫星定位可以象GPS那样广范应用。我以前也做过几个相关项目,如果可以用自己国家的我一定会放弃GPS,为我国的3S发展出自己的一份力。 第一次自己写,写的很少。只是一点感想。

发表回复

您的电子邮箱地址不会被公开。

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