遇到问题的场景:
需要查询出用户的基本信息(包括部门<默认第一个>,银行卡号等信息),项目中有表: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重复配置的问题。
声明:
以上只是个人意见,有些理解还不是太深入。