MySQL 子查询中的未知列

MySQL unknown column in subquery

我正在尝试为 table contests 实现 "rolling average",在 [=52] 中只有两列 idideas_count (int) =]:

对于 contests return id 中的每一行和前 10 行(包括当前行)的平均值 ideas_count

这就是我卡住的地方:

select 
  id, (
    select avg(ideas_count) from (
      select * from contests c2 where c2.id<=c1.id order by id desc limit 10
    ) prev
  ) 
from 
  contests c1
order by 
  id asc;

MySQL return 错误:“Unknown column 'c1.id' in 'where clause'

这是为什么?

我怎样才能完成这项工作?

更新

select 
  id, (
    select avg(ideas_count) from contests c2 
    where c2.id <= c1.id order by id desc limit 10
  ) 
from 
  contests c1
order by 
  id asc;

工作,因为它首先计算avg并应用limitafter,而我需要 最后 10 行的平均值

更新 2

添加了 SQLFiddle.

您可以将查询更新为:

select 
id, (select avg(ideas_count) from  
(select * from contests c2) prev where prev.id<=c1.id  order by prev.id desc limit 10 )     
as average 
from 
contests c1
order by id asc;

使用几个序列号,在子查询中生成。然后根据这些序列号加入子查询。

SELECT sub1.id, 
        AVG(sub2.ideas_count) AS rolling_average
FROM
(
    SELECT id, ideas_count, @seq1:=@seq1 + 1 AS seq
    FROM contests
    CROSS JOIN (SELECT @seq1:=0) sub0
    ORDER BY id
) sub1
INNER JOIN
(
    SELECT id, ideas_count, @seq2:=@seq2 + 1 AS seq
    FROM contests
    CROSS JOIN (SELECT @seq2:=0) sub0
    ORDER BY id
) sub2
ON sub2.seq BETWEEN sub1.seq -9 AND sub1.seq
GROUP BY sub1.id

希望能帮到你

select id , avg(ideas_count)
from (
    select t1.id, t1.t_id, t1.ideas_count, @i:=if(@j < t1.id, 1, @i+1) as i, @j:=t1.id as j
    from ( select c1.id, c2.id as t_id, c2.ideas_count
           from contests c2 join contests c1 on c2.id<=c1.id 
           order by c1.id asc, c2.id desc
        ) as t1
        join (select @i:=0, @j:=0) as t2
    ) as t3
where i <=10
group by id