从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语句进行更改的方法:
- 使用聚合函数(SUM,AVG,MAX,MIN等)
- 使用函数any_value()包含报错字段(即select有的字段但是没有在group by后)
- 不影响业务的情况下,把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
其他修改数据库方法可参考此链接:添加链接描述