【发布时间】:2013-10-20 20:24:42
【问题描述】:
我正在尝试获取项目的平均值,因此我使用了子查询。
更新:我一开始应该更清楚,但我希望平均只适用于最后 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;
当我这样做时,我得到错误 Unknown column 'y.id' in 'where clause',在进一步阅读这里我相信这是因为当查询进入下一个级别时,他们需要加入吗?
所以我尝试了下面的**删除了不需要的 suquery
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'不存在。我在正确的轨道上吗?我需要改变什么才能得到我想要的东西?
例子可以在here in 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
【问题讨论】:
-
你能发布你的表架构吗?
-
@SajunaFernando 我已经编辑了问题以显示这一点并添加到 sqlfiddle 中。
-
您能否补充一下您的问题,您希望插入小提琴中的数据的预期结果是什么?
-
请用英文准确描述你想要做什么。