MySQL AVG ... LIMIT返回总AVG

时间:2018-02-28 17:23:52

标签: mysql sql aggregate-functions

表:

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值)?

2 个答案:

答案 0 :(得分:3)

您需要使用子查询:

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

修改

没有子查询,执行顺序如下:

  1. FROM
  2. AVG(使用所有值计算AVG)
  3. ORDER BY(但只有一个值)
  4. LIMIT(一个值的限制3无效)
  5. 使用子查询执行的顺序如下:

    1. FROM
    2. ORDER BY
    3. LIMIT(仅3个值)
    4. 外部查询AVG(平均值仅使用3个值计算)
    5. 更多信息:Logical query processing(TOP / OFFSET FETCH与LIMIT相同)。

答案 1 :(得分:1)

请改为尝试:

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

DEMO