我试图获取一个项目的平均值,因此我正在使用子查询。
更新:我最初应该更清楚,但我只想要最后5个项目的平均值
首先我从以下内容开始:
SELECT
y.id
FROM (
SELECT *
FROM (
SELECT *
FROM products
WHERE itemid=1
) x
ORDER BY id DESC
LIMIT 15
) y;
这个程序可以运行,但它只显示 ID,相当无用。
然后我添加了以下内容:
SELECT
y.id,
(SELECT AVG(deposit) FROM (SELECT deposit FROM products WHERE id < y.id ORDER BY id DESC LIMIT 5)z) AVGDEPOSIT
FROM (
SELECT *
FROM (
SELECT *
FROM products
WHERE itemid=1
) x
ORDER BY id DESC
LIMIT 15
) y;
当我这样做时,我遇到了错误'where clause'中的未知列'y.id',在进一步阅读后,我认为这是因为查询下降到下一个级别时需要连接?
所以我尝试了下面的操作**移除了不必要的子查询
SELECT
y.id,
(SELECT AVG(deposit) FROM (
SELECT deposit
FROM products
INNER JOIN y as yy ON products.id = yy.id
WHERE id < yy.id
ORDER BY id DESC
LIMIT 5)z
) AVGDEPOSIT
FROM (
SELECT *
FROM products
WHERE itemid=1
ORDER BY id DESC
LIMIT 15
) y;
但是我得到了表'test.y'不存在的错误信息。我是否在正确的轨道上?我需要做什么更改才能得到我想要的结果呢?
可以在这里的 sqlfiddle 找到示例。
CREATE TABLE products
(`id` int, `itemid` int, `deposit` int);
INSERT INTO products
(`id`, `itemid`, `deposit`)
VALUES
(1, 1, 50),
(2, 1, 75),
(3, 1, 90),
(4, 1, 80),
(5, 1, 100),
(6, 1, 75),
(7, 1, 75),
(8, 1, 90),
(9, 1, 90),
(10, 1, 100);
给定这个例子中的数据,我的预期结果如下,每个ID旁边都有一列,其中包含前5次存款的平均值。
id | AVGDEPOSIT
10 | 86 (deposit value of (id9+id8+id7+id6+id5)/5) to get the AVG
9 | 84
8 | 84
7 | 84
6 | 79
5 | 73.75