MySQL AVG ... LIMIT 返回总平均值

nde*_*cca 3 mysql sql aggregate-functions

桌子 :

a | b
1 | 15
2 | 10
3 | 20
4 | 30
Run Code Online (Sandbox Code Playgroud)

询问:

SELECT AVG(table.b) FROM table ORDER BY table.a ASC LIMIT 3
Run Code Online (Sandbox Code Playgroud)

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

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

Luk*_*zda 5

您需要使用子查询:

SELECT AVG(b) 
FROM (SELECT b
      FROM table 
      ORDER BY table.a ASC 
      LIMIT 3) sub
Run Code Online (Sandbox Code Playgroud)

编辑:

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

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

对于子查询,执行顺序如下:

  1. 订购者
  2. 限制(只有 3 个值)
  3. 外部查询 AVG(仅使用 3 个值计算平均值)

更多信息:逻辑查询处理(TOP/OFFSET FETCH 与 LIMIT 相同)。