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

为何单SELECT语句无法筛选最大score行?JOIN可行但HAVING失效

为什么单条SELECT+GROUP BY的写法无法运行?

1. GROUP BY后的非聚合列问题

当你用GROUP BY id时,数据库会将相同id的行归为一个分组,每个分组最终只会返回一行结果。此时你在SELECT里写的score属于非聚合列——数据库无法确定要返回该分组中哪一行的score值(比如id=1的分组里有80、90、90三个score,数据库不知道该选哪一个)。

在MySQL的ONLY_FULL_GROUP_BY严格模式下,这种写法直接会报错,因为它违反了SQL标准:分组查询的SELECT列表只能包含聚合函数或GROUP BY子句中指定的列。

2. HAVING子句的逻辑错误

HAVING MAX(score) = score的逻辑本身不成立:

  • MAX(score)是当前id分组内的全局最大值
  • 而score是数据库从分组中随机选取的某一行的score值(非严格模式下)
    两者的取值逻辑完全不同,根本无法等价匹配。比如分组内最大值是90,但数据库随机选的score是80,那90=80显然不成立,自然不会返回正确结果;就算碰巧选到了90,也只能返回一行,而无法拿到分组内所有score等于最大值的行(比如两个90的行)。

对比子查询JOIN的写法

你最初的子查询写法逻辑是对的:

  1. 子查询先算出每个id对应的最大score
  2. 通过JOIN原表,匹配所有score等于对应id最大score的行,这样能拿到分组内所有符合条件的行,而且完全符合SQL标准,逻辑清晰。

举个对应你数据表的例子:
假设id=1的分组有score值80、90、90,子查询会得到id=1, score=90,然后JOIN原表后会返回两行score=90的记录,这正是你需要的结果。而GROUP BY的写法要么报错,要么只能返回一行随机的记录,无法满足需求。


内容的提问来源于stack exchange,提问作者Shadow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 02:10:39