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'

 

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐