mysql使用group by不规范,导致SELECT list is not in GROUP BY clause and contains nonaggregated column
select *,count(distinct fittings_list_code) from fittings_listwhere approval_status = '0'group by fittings_list_code数据库查询操作大致如上(别问我为啥能写出来这么逗的数据库查询语句,反正就想对fittings_list_code这个字段去下重,用distinct+group...
select *,count(distinct fittings_list_code) from fittings_list
where approval_status = '0'
group by fittings_list_code
数据库查询操作大致如上(别问我为啥能写出来这么逗的数据库查询语句,反正就想对fittings_list_code这个字段去下重,用distinct+group by 主要是因为这个表字段有点多,当时想着把所有字段都差出来,免得后面要求改动麻烦,然后就用里这种形式偷懒,但是这是不规范的group by用法,所以想偷懒出了问题我不负责)
结果就是本地服务器运行是运行正常,然后上远程服务器的时候,就报了ERROR 1055 (42000): Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'fittings_list.fittings_list_code' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by。
查了下导致这个问题的原因,据说是mysql5.7以后自动开启了 only_full_group_by服务,只要关了就行。
so,接下来就是解决方法了:
首先是一次性方案
SELECT @@GLOBAL.sql_mode;
或用
show variables like 'sql_mode';
查看当前的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去掉就完事了
SET sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,
NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
当然,这样修改只是你这一次会话有效,要永久有效还是修改配置文件吧。
配置文件,windows下修改my.ini,Linux下修改my.cnf,添加sql_mode='xx'就完事了。
当然偷懒是不对的,所以我最后使用了不偷懒的写法,不用group by了,毕竟整理了一下暂时需要的字段都能去重,不用写连表查询
select
distinct fault_code,address,approval_status,approver,approval_time,
reject_reason,reject_reason,username,fittings_list_code
from fittings_list
where approval_status = '0'
更多推荐
所有评论(0)