关于MySQL报错ONLY_FULL_GROUP_BY的解析

当你执行下边的SQL语句时,如果你的数据库没报错,那你要么MySQL版本低于5.6,要么就是人为关闭了ONLY_FULL_GROU_BY这个mode。

$result = Db::name('admin')->where('id', '3')

                                            ->order('id')

                                            ->update(['iphone' => 50]);


我觉得官方增加了这个参数,肯定就有它的必要性存在,那么,如何才能既满足官方对于语法的严格要求,又可以达到我们的查询目的呢?

方法自然是有的

$result = Db::name('admin')->where('id', '3')

                                            ->order('id')

                                            ->update(['iphone' => Db::name('admin')

                                                                                  ->where('id', '3')

                                                                                  ->value('iphone') + 50]);

那么问题来了,到底是什么原因造成系统报错

[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregate...

对于语义限制都比较严谨的多家数据库,如SQLServer、Oracled等数据库都不支持select target list中出现语义不明确的列,这样的语句在这些数据库中是会被报错的,所以从MySQL 5.7版本开始修正了这个语义,就是所说的ONLY_FULL_GROUP_BY语义。

知道了问题的原因,就要解决,那就是明确主查询和子查询之间的关联关系,听着好耳熟是不是,没错,对于同一张表来说,就是内关联查询,对于多表来说,就是左右关联查询和全关联查询。

举个小例子,这种方式在严格检查模式下肯定报错


select id,ename,sal from

  ( select * from e order by sal desc ) t group by id;

那改为这样就好了

select id ,ename,sal from

          e, (select id ,max(sal) as maxsal from e group by id ) as t 

          where e.id = t.id and e.sal = t.maxsal;

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • ORACLE自学教程 --create tabletestone ( id number, --序号usernam...
    落叶寂聊阅读 1,121评论 0 0
  • SQL ==SQLPLUS== DML(Data Manipulation Language,数据操作语言)---...
    蝌蚪1573阅读 612评论 0 4
  • 这一篇最主要是记录下命令,方便以后查找 使用Mysql 创建数据库 create database mysql_t...
    Treehl阅读 598评论 0 0
  • 一、SQL速成 结构查询语言(SQL)是用于查询关系数据库的标准语言,它包括若干关键字和一致的语法,便于数据库元件...
    shadow雨轩阅读 521评论 0 3
  • 有的时候,一个人如果不放下恐惧,不狠狠地逼自己一把,不敢迈出第一步,你永远不会成为你想成为的那个人! 能...
    金Patience阅读 298评论 0 1