博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql group by 报错 ,only_full_group_by 三种解决方案
阅读量:5058 次
发布时间:2019-06-12

本文共 2147 字,大约阅读时间需要 7 分钟。

报错信息

 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:

SELECT    ifnull( sum( treatmentTime ) / count( 1 ), 0 ) AS time FROM    (SELECT    TIMESTAMPDIFF( MINUTE, min( CreateTime ), max( EndTime ) ) AS treatmentTime FROM    statistics_report WHERE    CreateTime > ? SartTime     AND CreateTime < ? EndTime     AND IsReportOperate = 2     AND createtime <> endtime GROUP BY    reportid     ) a

解决方案:

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

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

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


 

成功的写法:

1:
SELECT    ifnull( sum( checkTime ) / count( 1 ), 0 ) AS time FROM    ( SELECT TIMESTAMPDIFF( MINUTE, CreateTime, EndTime ) AS checkTime, reportid FROM statistics_report WHERE ReportStatus = 2 ) a GROUP BY    reportid -- 这里只是将group by 移动到了括号外面,在括号内不分组,在括号外进行分组,checkTime用sum函数来取值,解决问题。

2:

SELECT    ifnull( sum( timestampdiff( MINUTE, starttime, endtime ) ) / count( 1 ), 0 ) AS time FROM    (SELECT    min( createtime ) starttime,    max( endtime ) endtime,    reportid FROM    statistics_report WHERE    CreateTime > ? SartTime     AND CreateTime < ? EndTime     AND IsReportOperate = 2     AND createtime <> endtime GROUP BY    reportid     ) a -- 这里是将timestampdiff 于min max 分开,在进行取最大最小值的时候group  by  ;在timestampdiff 的時候 不需要分組 ,因为这时候reportid 没有重复的。 -- 另外这里加了ifnull 是为了取到数据的时候避免null
 

结束分析:

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

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

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

转载于:https://www.cnblogs.com/zhaokunbokeyuan256/p/11132600.html

你可能感兴趣的文章
代码实现导航栏分割线
查看>>
一个mysql主从复制的配置案例
查看>>
大数据学习系列(8)-- WordCount+Block+Split+Shuffle+Map+Reduce技术详解
查看>>
【AS3代码】播放FLV视频流的三步骤!
查看>>
枚举的使用
查看>>
luogu4849 寻找宝藏 (cdq分治+dp)
查看>>
日志框架--(一)基础篇
查看>>
关于源程序到可运行程序的过程
查看>>
转载:mysql数据库密码忘记找回方法
查看>>
scratch少儿编程第一季——06、人在江湖混,没有背景怎么行。
查看>>
【贪心+DFS】D. Field expansion
查看>>
C# Async与Await的使用
查看>>
Mysql性能调优
查看>>
iOS基础-UIKit框架-多控制器管理-实例:qq界面框架
查看>>
IOS-每个程序员的编程之路上都应该看这11本书
查看>>
自定义tabbar(纯代码)
查看>>
小程序底部导航栏
查看>>
ibatis学习笔记
查看>>
18-ES6(1)
查看>>
poj1611 简单并查集
查看>>