参考下面两个帖子的内容:
mysql报错ONLY_FULL_GROUP_BY解决(修改sql_mode)
真正有效解决ONLY_FULL_GROUP_BY的问题
执行的sql
select t1.cloumn1 , t1,cloumn2
from table t1
group by t1.cloumn1
执行后的报错信息
Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated
column 'table.field' which is not functionally dependent on columns in GROUP BY clause;
this is incompatible with sql_mode=only_full_group_by
第一种方案:
修改sql_mode,不考虑 ,通过搜索引擎检索到的解决方案也基本都是这种操作,
实际上大多数生产环境也并不允许你随便修改sql_mode来解决这个问题。
第二种方案:
修改sql,让sql达到sql_mode要求,不出现报错信息。
修改之前我们得知道为啥会出现这个问题。
错误原因
在mysql5.7.5的版本之前是默认不打开ONLY_FULL_GROUP_BY这个sql_mode的,也就是说出现这个问题通常只会存在于5.7.5+的版本上。
mysql官方给的ONLY_FULL_GROUP_BY解释:
简单说就是:如果在SELECT中的列既没有在GROUP_BY中出现,本身也不是聚合列(使用SUM,ANG等修饰的列),
那么这句SQL是不合法的,因为那一列是不确定的。
解决方案
知道为啥了,解决方案自然也就出来了:让select中的字段和group by里面的字段保持一致。 实际操作中一个错误sql:
SELECT
u.NAME,
up.PASSWORD
FROM
user u
LEFT JOIN user_password up ON u.id = up.user_id
GROUP by u.NAME
修改后的正确sql:
SELECT
u.NAME,
up.PASSWORD
FROM
user u
LEFT JOIN user_password up ON u.id = up.user_id
GROUP by u.NAME,up.PASSWORD
最后提供一种项目中解决这个问题的思路:
通常我们项目中做分组查询的时候,需要拆分为两部分,
第一部分:只查分组字段的信息(需要包含id),
第二部分:通过分组查询出来的id,再查询具体的单条记录数据。
|