当你执行下边的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;