You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL如何在不关闭only_full_group_by的情况下避免ERROR 1055 (42000)错误

问题分析

  • 你的写法存在两处核心问题:
    1. 子查询中直接引用了T.category列,该列既没有出现在GROUP BY子句中,也没有被聚合函数包裹。按id分组后,同一个id对应多条不同category的记录,数据库无法确定应该取哪条记录的category做条件判断,触发了only_full_group_by校验报错。
    2. 你写的标量子查询逻辑冗余,不需要嵌套子查询即可实现分组内的条件取值。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 04:30:03