zoukankan      html  css  js  c++  java
  • 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
    否则就会报错

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

  • 相关阅读:
    ControlExtensionTest(一)
    CCNotificationCenter(二)---NotificationCenterTest
    CCNotificationCenter(一)
    cocos2d-x笔记-CCGLProgram
    cocos2d-x笔记 ccTouchesBegan、ccTouchesMoved、ccTouchesEnded
    CCDictionary(转)
    ios笔记一(面向对象编程)
    cocos2d-x--精灵反转效果--CCOrbitCamera
    Android系统框架介绍
    cocos2d-x 粒子动作 setTexture
  • 原文地址:https://www.cnblogs.com/lxwphp/p/15453117.html
Copyright © 2011-2022 走看看