MySQL不支持FETCH子句的替代方案及聚合HAVING查询问题排查
MySQL FETCH子句替代方案
MySQL 8.0以下版本原生不支持标准SQL的FETCH子句,统一使用LIMIT关键字实现等价功能:
- 取结果集前N行:等价于
FETCH FIRST N ROWS ONLY,直接在查询末尾加LIMIT N即可 - 分页偏移取数:等价于
OFFSET M FETCH NEXT N ROWS ONLY,可写为LIMIT M, N或者LIMIT N OFFSET M两种格式
问题SQL排查与修复
现有语句错误点
你提交的SQL存在两个核心问题:
- 不支持嵌套聚合函数:
MAX(SUM(registration.RegFeeAmntPaid))属于两层聚合函数嵌套,SQL执行顺序中HAVING是在GROUP BY聚合之后执行,无法直接对聚合后的SUM结果再做MAX聚合计算 - GROUP BY字段不匹配(可选报错):如果你的MySQL开启了
ONLY_FULL_GROUP_BY默认模式,SELECT子句中出现的非聚合字段FirstName、LastName没有加入GROUP BY,也会触发语法错误
修复方案
你的需求是找出报名费总收款额最高的员工,提供两种常用实现:
方案1:适配多并列第一的场景(返回所有总金额最高的员工)
SELECT r.Staff_ID, s.FirstName, s.LastName, SUM(r.RegFeeAmntPaid) AS The_Best_Seller FROM registration r INNER JOIN staff s ON r.Staff_ID = s.Staff_ID GROUP BY r.Staff_ID, s.FirstName, s.LastName HAVING SUM(r.RegFeeAmntPaid) = ( SELECT MAX(total_fee) FROM ( SELECT SUM(RegFeeAmntPaid) AS total_fee FROM registration GROUP BY Staff_ID ) t );
方案2:仅需返回任意一个最高额员工时简化写法
SELECT r.Staff_ID, s.FirstName, s.LastName, SUM(r.RegFeeAmntPaid) AS The_Best_Seller FROM registration r INNER JOIN staff s ON r.Staff_ID = s.Staff_ID GROUP BY r.Staff_ID, s.FirstName, s.LastName ORDER BY The_Best_Seller DESC LIMIT 1;
内容的提问来源于stack exchange,提问作者eli
相关产品推荐
相关产品推荐

