开发中遇见mysql中ONLY_FULL_GROUP_BY模式的问题

遇到问题的场景:

需要查询出用户的基本信息(包括部门<默认第一个>,银行卡号等信息),项目中有表:member、department、department_member和bank_card,需要从这4张表中查询出需要的数据。

初步想法,4张表联合查询,获取到结果集;

select  m.id as 'memberId', m.ceair_ZYGGH as 'number',
 m.name as 'name',d.name as 'deptName',m.work_mobile as 'phone',
 m.id_number as 'idCard',bc.card_no as 'bankNumber',m.status as 'status' 
from member m    
join department_member dm on dm.member_id=m.id 
join department d on dm.department_id=d.id
LEFT JOIN bank_card bc on bc.member_id=m.id where 1=1
group by m.id 
order by m.name asc

代码运行过程中会报一下错误:

 1055 - Expression #4 of SELECT list is not in GROUP BY clause
 and contains nonaggregated column 'ybx_biz.d.name' which is not
 functionally dependent on columns in GROUP BY clause;
 this is incompatible with sql_mode=only_full_group_by

遇见问题就要解决问题,便求助强大的度娘,得到问题所在:

MySQL升级到5.7或者更高的版本在ONLY_FULL_GROUP_BY这个模式下,我们使用分组查询时,出现在select字段后面的只能是group by后面的分组字段,或使用聚合函数包裹着的字段。

我的解决方案:

在查询之前先执行以下语句:

SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))

暂时先把ONLY_FULL_GROUP_BY模式去掉(仅仅在当前命令窗口才会生效,重启mysql后你会发现配置又会回来的),然后再执行所要执行的联合查询分组语句。

总结:

因为项目需要,和测试环境和正式环境的部署问题,最终决定使用“SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))”这种代码中解决的方式进行解决,不需要考虑到多个环境中不同的mysql重复配置的问题。

声明:

以上只是个人意见,有些理解还不是太深入。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值