MySQL中计算ei_benefits表salary前14高值平均值的报错咨询
语法报错原因与版本兼容性说明
你遇到的#1235报错不是版本高低的临时限制:
- MySQL从5.x时代开始就从优化器层面禁止在
IN/ALL/ANY/SOME类子查询内部直接嵌入LIMIT语法,当前线上主流的5.7、8.x版本都不支持原写法直接运行,不存在“换个新版本就能正常执行”的可能。 - 只有早已停止维护的4.x系列远古版本没有该语法限制,但这类版本已经不具备生产使用价值。
可直接在当前环境运行的正确实现
根据你的实际统计需求,可以选以下两种写法:
- 完全对齐你原有逻辑(统计所有匹配前14个最高薪资值的记录的薪资平均):
只需要在带LIMIT的子查询外层多套一层临时派生表,把LIMIT的排序结果先物化为临时数据集,就可以完全绕开语法限制:SELECT AVG(salary) FROM ei_benefits WHERE salary IN ( SELECT salary FROM ( SELECT salary FROM ei_benefits ORDER BY salary DESC LIMIT 14 ) AS top_salary_temp ) - 更贴合原始需求的精准写法:
如果你需要的是严格取排序后的前14条记录的薪资值计算平均,不需要因为薪资重复匹配到更多行,直接对子查询结果求平均即可,没有必要套IN判断:
这个写法的优势是完全规避了IN子查询的语法限制,统计范围精准,也不会因为表里存在重复薪资导致统计样本超过14条,执行性能也比IN关联的写法更高。SELECT AVG(salary) FROM ( SELECT salary FROM ei_benefits ORDER BY salary DESC LIMIT 14 ) AS top14_salary
注意:如果原表的salary存在空值,两种写法都会自动把空值从AVG的计算样本中排除,和常规SQL的聚合逻辑一致。
内容的提问来源于stack exchange,提问作者SQLrookie
相关产品推荐
相关产品推荐

