Tôi không phải là chuyên gia về MySQL (trong MS SQL thì việc này có thể được thực hiện dễ dàng hơn) và câu hỏi của bạn có vẻ hơi không rõ ràng đối với tôi, nhưng có vẻ như bạn đang cố gắng lấy điểm trung bình của 5 mục trước đó.
Nếu bạn có Id không có khoảng trống , thật dễ dàng:
select
p.id,
(
select avg(t.deposit)
from products as t
where t.itemid = 1 and t.id >= p.id - 5 and t.id < p.id
) as avgdeposit
from products as p
where p.itemid = 1
order by p.id desc
limit 15
Nếu không , thì tôi đã cố gắng thực hiện truy vấn như thế này
select
p.id,
(
select avg(t.deposit)
from (
select tt.deposit
from products as tt
where tt.itemid = 1 and tt.id < p.id
order by tt.id desc
limit 5
) as t
) as avgdeposit
from products as p
where p.itemid = 1
order by p.id desc
limit 15
Nhưng tôi có ngoại lệ Unknown column 'p.id' in 'where clause'
. Có vẻ như MySQL không thể xử lý 2 cấp độ lồng các truy vấn con nhưng bạn có thể lấy 5 mục trước đó với offset
, như thế này:
select
p.id,
(
select avg(t.deposit)
from products as t
where t.itemid = 1 and t.id > coalesce(p.prev_id, -1) and t.id < p.id
) as avgdeposit
from
(
select
p.id,
(
select tt.id
from products as tt
where tt.itemid = 1 and tt.id <= p.id
order by tt.id desc
limit 1 offset 6
) as prev_id
from products as p
where p.itemid = 1
order by p.id desc
limit 15
) as p