解决MySQL的Group By之中ONLY_FULL_GROUP_BY

目录

1、案例场景

2、解决方案

2.1、修改mysql配置文件

2.2、通过临时去掉ONLY_FULL_GROUP_BY 模式来进行查询

2.3、没有参与分组的字段, 使用ANY_VALUE()函数包括

3、成果展现

4、总结

5、参考文章


1、案例场景

我们在实际实现业务功能时候可能遇见查询分组(group by),但是可能有些业务需求需要返回除分组字段的其他字段,如果数据库配置文件之中未设置ONLY_FULL_GROUP_BY配置,或者因为优化配置此参数为关闭。但是实际业务又需要返回需求除分组以外的字段。下面的方法就是几种解决此类问题的几种实现方法。

2、解决方案

2.1、修改mysql配置文件

linux下查找是哪个配置文件 grep sql_mode -R /etc/mysql/*

修改sql_mode选项部分 , 去掉ONLY_FULL_GROUP_BY 或者修改阿里云上的参数

2.2、通过临时去掉ONLY_FULL_GROUP_BY 模式来进行查询

select @@global.sql_mode;

去掉里面的 ONLY_FULL_GROUP_BY 模式,然后set 回去

登录后复制
set @@global.sql_mode = "查出来的值,去掉 ONLY_FULL_GROUP_BY"

2.3、没有参与分组的字段, 使用ANY_VALUE()函数包括

3、成果展现

SELECT
  t.user_name,
	any_value(max(t.access_time)) as access_time,
	any_value(t.ipaddr) as ipaddr,
	any_value(t.login_location) as login_location,
	any_value(SUBSTRING_INDEX(t.login_location,' ',1)) as province,
	any_value(SUBSTRING_INDEX(t.login_location,' ',-1)) as city,
	any_value(t.browser) as browser,
	any_value(t.os) as os,
	any_value(t.msg) as msg
FROM
	sys_logininfor t 
WHERE
	t.`status` = 0 
	and t.ipaddr!='127.0.0.1'
	AND t.msg = '登录成功' 
	AND 
	-- TO_DAYS( t.access_time )= TO_DAYS(NOW())
	date_sub(NOW(), interval 2 day) <= date(t.access_time)
	GROUP BY t.user_name,date_format(t.access_time,'%Y-%m-%d')
	
	

4、总结

      我们在解决实际问题之中可能因为各种限制条件,我们只能通过转换思路,寻找另外思路能够去解决问题。我们实际工作之中可能有多重限定条件;甚至可能出现与网上的解决方案不一致的场景。只能结合具体场景实际情况进行解决问题。

5、参考文章

mysql中GROUP BY时报错sql_mode=only_full_group_by错误

mysql的ANY_VALUE()函数 解决 ONLY_FULL_GROUP_BY 模式

MySQL严格模式的ONLY_FULL_GROUP_BY解决办法

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值