You need to enable JavaScript to run this app. MySQL中计算ei_benefits表salary前14高值平均值的报错咨询
优惠活动
大模型
产品
解决方案
定价
更多

MySQL中计算ei_benefits表salary前14高值平均值的报错咨询

语法报错原因与版本兼容性说明

你遇到的#1235报错不是版本高低的临时限制:

  • MySQL从5.x时代开始就从优化器层面禁止在IN/ALL/ANY/SOME类子查询内部直接嵌入LIMIT语法,当前线上主流的5.7、8.x版本都不支持原写法直接运行,不存在“换个新版本就能正常执行”的可能。
  • 只有早已停止维护的4.x系列远古版本没有该语法限制,但这类版本已经不具备生产使用价值。

可直接在当前环境运行的正确实现

根据你的实际统计需求,可以选以下两种写法:

  1. 完全对齐你原有逻辑(统计所有匹配前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
    )
    
  2. 更贴合原始需求的精准写法:
    如果你需要的是严格取排序后的前14条记录的薪资值计算平均,不需要因为薪资重复匹配到更多行,直接对子查询结果求平均即可,没有必要套IN判断:
    SELECT AVG(salary)
    FROM (
        SELECT salary 
        FROM ei_benefits 
        ORDER BY salary DESC 
        LIMIT 14
    ) AS top14_salary
    
    这个写法的优势是完全规避了IN子查询的语法限制,统计范围精准,也不会因为表里存在重复薪资导致统计样本超过14条,执行性能也比IN关联的写法更高。

注意:如果原表的salary存在空值,两种写法都会自动把空值从AVG的计算样本中排除,和常规SQL的聚合逻辑一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.08 02:54:01