MySQL5.7.5及以上执行group by报错

MySQL5.7.5及以上执行group by报错,第1张

MySQL5.7.5及以上执行group by报错

MySQL执行报错: [Err] 1055 - expression #1 of SELECt list is not in GROUP BY clause and contains nonaggregated column 'cerebrum_sit.s.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

项目场景:

MySQL 5.7.5执行group by column_name 报错,执行sql报错信息如上,具体sql如下:

    SELECT
		s.id,
		s. CODE,
		s. NAME,
		s.start_date startDate,
		s.end_date endDate
	FROM
		store s
	WHERe
		CODE IN (
			'FTSNCWLJ1561',
			'FTSSCWLJ0316',
			'FTSNCWLJ2250',
			'FTSECWLJ1013',
			'FTSECWLJ1235',
			'FTSECWLJ2253',
			'FTSECWLJ2362',
			'FTSNCWLJ1873',
			'FTSECWLJ0154',
			'FTSECWLJ0981',
			'FTSSCWLJ1225',
			'FTSNCWLJ1561',
			'FTSNCWLJ1561',
			'FTSNCWLJ1547',
			'FTSCCWLJ0264',
			'FTSECWLJ1289',
			'FTSECWLJ1003',
			'FTSNCWLJ1996'
		)
	GROUP BY CODE

        这段sql看着确实没有问题,包括很多人在大学学习的都是这种写法,但是运行却会报错,如下图:

开始我也百思不得其解,经过各种资料查阅,才发现该报错主要是MySQL的版本,这个问题主要发生在mysql5.7.5及以上,因为MySQL5.7.5的sql模式配置是“only_full_group_by”,这个我们在报错信息中也可以看出来,这个配置启用时“严格ANSI sql规则”,该规则要求在group by的时候,没有聚合的列,在group by 的时候,必须全部包含在group by的字段中。没有聚合的列,指的是没有使用 max, min, count, sum....这些函数的列,直接查询出字段的列。


原因分析:

提示:这里,我们首先了解下group by 的用法,具体如下:

GROUP BY子句重要规则:

包含任意数目的列,如果在GROUP BY 子句中套入分组,数据将会最后规定的分组上进行总汇。GROUP BY 子句中列出的没列都必须是检索的列,有效的表达式,不能聚集函数。大多数SQL不允许GROUP BY 带有长度可变的数据类型(文本,备注型字段)除聚集计算语句外,SELECt 语句中,每个列都必须在GROUP BY子句中给出。如果分组带有NULL值,将作为一个分组返回,如果多个将成一组。GROUP BY 子句必须出现在WHERe子句之后,

        看到上面标红的规则,再结合我们的sql,我们就能很轻易的找出问题的所在,原因是我们group by 后只有code字段,但是我们select的却是多个字段,问题一目了然。


解决方案:

        找到了问题的原因,那我们应该怎么办呢,不可能只查一个code字段,与开发的需求不符,但是group by 所以查询字段,又无法达到通过code去重的需求,这时我们可以使用max()函数进行处理,具体写法如下:

	SELECT
		max(id) id,
		code,
		max(name) name,
		max(start_date) startDate,
		max(end_date) endDate
	FROM
		store s
	WHERe
		CODE IN (
			'FTSNCWLJ1561',
			'FTSSCWLJ0316',
			'FTSNCWLJ2250',
			'FTSECWLJ1013',
			'FTSECWLJ1235',
			'FTSECWLJ2253',
			'FTSECWLJ2362',
			'FTSNCWLJ1873',
			'FTSECWLJ0154',
			'FTSECWLJ0981',
			'FTSSCWLJ1225',
			'FTSNCWLJ1561',
			'FTSNCWLJ1561',
			'FTSNCWLJ1547',
			'FTSCCWLJ0264',
			'FTSECWLJ1289',
			'FTSECWLJ1003',
			'FTSNCWLJ1996'
		)
	GROUP BY CODE

        该sql可正确的查出我们想要的结果,如下图:

        由于mysql版本的提升,很多使用group by的场景,我们都可以使用类似的写法,但是使用这种方法虽然能实现功能需求,但是查询速度却比较慢
 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5706184.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存