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

3

表格:

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个回答

5

您需要使用子查询:

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 (对一个值进行LIMIT 3不会产生影响)

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

  1. FROM
  2. ORDER BY
  3. LIMIT (仅针对3个值)
  4. 外部查询AVG(只使用3个值计算平均值)

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


帮了我很大的忙,你能解释一下为什么必须这样做吗?在我看来,AVG的工作方式与LIMIT没有任何连接并不是很直观。 - ndelucca
@ndelucca 当然,我已经添加了详细的解释。 - Lukasz Szozda

1
尝试使用这个替代方案:
SELECT AVG(A.b) FROM
(SELECT `table`.b FROM `table` ORDER BY `table`.a ASC LIMIT 3) A;

演示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接