【问题标题】:MySQL AVG ... LIMIT returns total AVGMySQL AVG ... LIMIT 返回总 AVG
【发布时间】:2018-02-28 17:23:52
【问题描述】:

表:

a | b
1 | 15
2 | 10
3 | 20
4 | 30

查询:

SELECT AVG(table.b) FROM table ORDER BY table.a ASC LIMIT 3

将返回 18.75 而不是预期的 15。

如何更改查询以获得我的预期结果(AVG 有限行数的值)?

【问题讨论】:

    标签: mysql sql aggregate-functions


    【解决方案1】:

    你需要使用子查询:

    SELECT AVG(b) 
    FROM (SELECT b
          FROM table 
          ORDER BY table.a ASC 
          LIMIT 3) sub
    

    编辑:

    没有子查询的执行顺序是这样的:

    1. 来自
    2. AVG(使用所有值计算 AVG)
    3. ORDER BY(但只有一个值)
    4. LIMIT(LIMIT 3 对一个值什么都不做)

    子查询的执行顺序是这样的:

    1. 来自
    2. 订购人
    3. LIMIT(仅限 3 个值)
    4. 外部查询 AVG(仅使用 3 个值计算平均值)

    更多信息:Logical query processing(TOP/OFFSET FETCH 与 LIMIT 相同)。

    【讨论】:

    • 帮了我很大的忙,你能解释一下为什么必须这样做吗?在我看来,与 LIMIT 没有任何联系的 AVG 的工作方式不是很直观
    • @ndelucca 当然我已经添加了详细解释
    【解决方案2】:

    试试这个:

    SELECT AVG(A.b) FROM
    (SELECT `table`.b FROM `table` ORDER BY `table`.a ASC LIMIT 3) A;
    

    DEMO

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多