ERROR 1055 (42000): Expression #1 of SELECT list is not in

ERROR 1055 (42000): Expression #1 of SELECT list is not in

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

报错:

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 inERROR 1055 (42000): Expression #1 of SELECT list is not inERROR 1055 (42000): Expression #1 of SELECT list is not in

但是查看自己的配置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;

ERROR 1055 (42000): Expression #1 of SELECT list is not in

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

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

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


相关推荐

  • labelme怎么安装_putty安装教程

    labelme怎么安装_putty安装教程Labelme安装教程(基于anaconda)1.创建anaconda虚拟环境labelmecondacreate-nlabelmepython=3.6完成之后如图所示(由于我已经创建了labelme故这里用labelme1代替)激活环境:condaactivatelabelme执行完这一步会发现运行环境转移到了labelme,如果没有重新创建2.安装labelme所需要的依赖环境安装的时候使用pip或者conda都可以,两者之中有一个不行时尝试使用另一个,我在安装的时

    2022年9月11日
    0
  • Navicat连接Mysql8.0.11出现1251错误

    Navicat连接Mysql8.0.11出现1251错误重装了电脑,安装了最新版的MySQL数据库,结果Navicat连接Mysql报1251错误,sqlyog报2058错误,但是window命令进入mysql,账号密码都是正确的。在网上查的是,出现这个原因是mysql8之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password,解决问题方法有两种…

    2022年10月15日
    0
  • Qt 垂直布局 (QVBoxLayout)

    Qt 垂直布局 (QVBoxLayout)Qt垂直布局(QVBoxLayout)上一节说了水平布局:https://blog.csdn.net/weixin_42837024/article/details/82114258QVBoxLayout:在垂直的方向上排列控件上下排列QVBoxLayout*pLayout=newQVBoxLayout();//水平布局QPushButton*p…

    2022年6月15日
    31
  • 两个list取交集_python两个list取并集

    两个list取交集_python两个list取并集两个list求交集,一种方式是手动遍历,然后判断是否contains,然后添加到结果list中这里介绍另外一个方法直接调用list1.retainAll(list2),调用完成后,list1中不在list2的元素都会被剔除,此时list1就是交集/***retain*保留*/@TestpublicvoidtestRetain(){List<String>list1=

    2022年10月6日
    0
  • 【转载】究竟啥才是互联网架构“高可用”

    【转载】究竟啥才是互联网架构“高可用”

    2021年11月20日
    42
  • Unity3D

    Unity3D

    2022年2月2日
    34

发表回复

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

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