MySQL如何在不关闭only_full_group_by的情况下避免ERROR 1055 (42000)错误
问题分析
- 你的写法存在两处核心问题:
- 子查询中直接引用了
T.category列,该列既没有出现在GROUP BY子句中,也没有被聚合函数包裹。按id分组后,同一个id对应多条不同category的记录,数据库无法确定应该取哪条记录的category做条件判断,触发了only_full_group_by校验报错。 - 你写的标量子查询逻辑冗余,不需要嵌套子查询即可实现分组内的条件取值。
- 子查询中直接引用了
only_full_group_by 底层逻辑
这个安全校验的核心作用是避免分组查询返回不确定的结果:当你使用GROUP BY分组后,每个分组最终只会返回一行数据,如果你SELECT的列不属于分组字段,也没有被聚合函数(MAX/MIN/SUM/COUNT等)包裹,数据库无法确定应该返回分组内多条记录中的哪一个值,属于逻辑上的不确定性,因此会被校验拦截。
符合规范的正确写法
仅查询id和category1的版本
SELECT id, MAX(CASE WHEN category = 'category1' THEN value END) AS category1 FROM MyTable GROUP BY id;
完整查询id、category1、category2的版本
SELECT id, MAX(CASE WHEN category = 'category1' THEN value END) AS category1, MAX(CASE WHEN category = 'category2' THEN value END) AS category2 FROM MyTable GROUP BY id;
写法说明
- 先通过
CASE WHEN对分组内的每一行做判断:符合category条件的返回对应的value,不符合的返回NULL - 再通过
MAX聚合函数取出分组内不为空的value值,因为你的表是id+category的联合主键,同一个id下同一个category最多只有一条记录,所以MAX/MIN都可以拿到正确值,不会有计算偏差 - 最终
SELECT的字段要么是分组字段id,要么是被聚合函数包裹的计算结果,完全符合only_full_group_by的校验规则。
内容的提问来源于stack exchange,提问作者user16814165
相关产品推荐
相关产品推荐

