目录
2.2、通过临时去掉ONLY_FULL_GROUP_BY 模式来进行查询
2.3、没有参与分组的字段, 使用ANY_VALUE()函数包括
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错误