mysql client only_mysql group by 报错 ,only_full_group_by 三种解决方案

报错信息

Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'database.table.column' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

翻译过来就是在group by 的地方有一些列是没有包括进去的

具体问题具体分析,我这里的问题是:select 的时候使用了TIMESTAMPDIFF 中的两个列名并没有包括在group by 中

mysql 5.7以后的版本数据库的默认模式设置成了  only_full_group_by模式,而在执行的sql里有一些重复的行group by 的时候mysql 不知道选择哪一个行

错误实例

1:

SELECT

ifnull( sum( checkTime ) / count( 1 ), 0 ) AS time

FROM

( SELECT TIMESTAMPDIFF( MINUTE, CreateTime, EndTime ) AS checkTime FROM statistics_report WHERE AND ReportStatus = 2 GROUP BY reportid ) a

2:

SELECTifnull(sum( treatmentTime ) / count( 1 ), 0 ) AStimeFROM(SELECTTIMESTAMPDIFF( MINUTE,min( CreateTime ), max( EndTime ) ) AStreatmentTimeFROMstatistics_reportWHERECreateTime>? SartTimeAND CreateTime EndTimeAND IsReportOperate = 2

AND createtime <>endtimeGROUP BYreportid

) a

解决方案:

1:使用any_value() 包括具体提示的列名,使mysql 不再纠结与具体哪一个列

2: 把sql_mode 改成非only_full_group_by模式(如果是刚开发项目,且 ,对于项目有深入了解后 ,进行可行性分析后 再改,一般不建议,)

3:把sql 优化 ,对于每一个分组的元素 清晰的告知mysql 需要怎么选择

成功的写法:

1:

SELECTifnull(sum( checkTime ) / count( 1 ), 0 ) AStimeFROM(SELECT TIMESTAMPDIFF( MINUTE, CreateTime, EndTime ) AS checkTime, reportid FROM statistics_report WHERE ReportStatus = 2) aGROUP BYreportid

-- 这里只是将group by 移动到了括号外面,在括号内不分组,在括号外进行分组,checkTime用sum函数来取值,解决问题。

2:

SELECTifnull(sum( timestampdiff( MINUTE, starttime, endtime ) ) / count( 1 ), 0 ) AStimeFROM(SELECT

min( createtime ) starttime,max( endtime ) endtime,

reportidFROMstatistics_reportWHERECreateTime>? SartTimeAND CreateTime EndTimeAND IsReportOperate = 2

AND createtime <>endtimeGROUP BYreportid

) a

-- 这里是将timestampdiff 于min max 分开,在进行取最大最小值的时候group by ;在timestampdiff 的時候 不需要分組 ,因为这时候reportid 没有重复的。

-- 另外这里加了ifnull 是为了取到数据的时候避免null

结束分析:

group by 的问题 很奇怪的点在于 5.7 的mysql 版本改版;bug出现具有偶发性;在mysql client执行不抱错,而在程序中执行会报错;

这是哪个问题导致了问题的复杂性,在了解问题原理后 从根本上解决是最直接的方案。

时常问问自己:是不是太菜。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值