从sql语句解决sql报错——this is incompatible with sql_mode=only_full_group_by

从sql语句解决sql报错——this is incompatible with sql_mode=only_full_group_by

在写项目的时候在不同的环境下使用同一个sql分组语句有些环境可以成功运行。但是有些sql被拒绝执行了

SELECT
	wic.username AS userName,
	COUNT( wic.project_name ) projectCount,
	wic.weekly_id weeklyId,
	wic.all_hour weekTime 
FROM
	(
	SELECT
		wc.username,
		wc.project_name,
		wi.weekly_id,
		wi.all_hour
	FROM 
		weekly_info wi
		LEFT JOIN weekly_content wc ON wi.weekly_id = wc.weekly_id 
	WHERE
		date( wi.start_time ) = date( '2021-12-20' ) 
		AND wi.send_people LIKE '%' 
		AND wi.save = 0 
	GROUP BY
		wc.username,
		wc.project_name 
	) wic 
GROUP BY
	wic.username

这个sql使用了两次分组。sql运行时进行了报错

在这里插入图片描述

出现一闪错误的原因是因为分组遇到重复数据需要取出一条展示的时候,数据库不知道应该取哪一条。此时需要给数据库一个明确取出哪条数据的只想

出现此错误的原因是:因为group by 后的字段相当于map中的key,分组时会遇上key重复的情况。需要给数据库一种处理策略才能继续筛选出结果。否则就会报错(自己的理解,欢迎指正)

经过百度后发现可以通过修改数据库配置或者sql语句进行更改。

此处只介绍通过修改sql语句进行更改的方法:

  1. 使用聚合函数(SUM,AVG,MAX,MIN等)
  2. 使用函数any_value()包含报错字段(即select有的字段但是没有在group by后)
  3. 不影响业务的情况下,把group by后的字段补全和select后的字段一致

最后我在没有分组的字段上加上聚合函数就可以执行成功了

SELECT
	wic.username AS userName,
	COUNT( wic.project_name ) projectCount,
	max(wic.weekly_id) weeklyId,
	max(wic.all_hour) weekTime 
FROM
	(
	SELECT
		wc.username,
		wc.project_name,
		max(wi.weekly_id) weekly_id,
		max(wi.all_hour)  all_hour
	FROM 
		weekly_info wi
		LEFT JOIN weekly_content wc ON wi.weekly_id = wc.weekly_id 
	WHERE
		date( wi.start_time ) = date( '2021-12-20' ) 
		AND wi.send_people LIKE '%' 
		AND wi.save = 0 
	GROUP BY
		wc.username,
		wc.project_name 
	) wic 
GROUP BY
	wic.username

其他修改数据库方法可参考此链接:添加链接描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值