我想将产品与最近一小时的最新价值和价值一起退回。
我有一个产品表:
id, name, type (and so on)...
我有一个值表:
id_prod, timestamp, value
类似的东西:
12:00:00 = 10
12:15:00 = 10
12:30:00 = 10
12:45:00 = 10
13:00:00 = 10
13:15:00 = 10
13:30:00 = 10
我想要一个返回最新值(13:30:00)的查询以及一小时后的值总和。这应该返回:
time = 13:30:00
latestread = 10
lasthour = 40
我几乎开始工作的是:
SELECT *,
(SELECT value FROM values S WHERE id_prod=P.id
ORDER BY timestamp DESC LIMIT 1) as latestread,
(SELECT sum(value) FROM values WHERE id_prod=D.id and
date_created>SUBTIME(S.date_created,'01:00:00')) as trendread
FROM prod P ORDER BY name
但是在'where子句'“
中”未知列'S.date_created'失败了有什么建议吗?
答案 0 :(得分:1)
如果我理解你正在尝试做什么,那么你会有类似的东西:
SELECT p.id, max(date_created), sum(value), mv.max_value
FROM product p
JOIN values v on p.id = v.product_id
JOIN (SELECT product_id, value as max_value
FROM values v2
WHERE date_created = (SELECT max(date_created) FROM values WHERE product_id=v2.product_id)) mv on product_id=p.id
WHERE date_created between DATE_SUB(now(), INTERVAL 1 HOUR)) and now()
GROUP BY p.id
ORDER BY p.id
答案 1 :(得分:1)
Aleks G和mhasan给出了解决方案,但不是失败的原因。失败的原因是因为别名S在子查询中是未知的。子查询不了解其范围之外的表。
答案 2 :(得分:0)
您错过了在
下面的子查询中为表值提供别名SELECT *,
(SELECT value FROM values S WHERE id_prod=P.id
ORDER BY timestamp DESC LIMIT 1) as latestread,
(SELECT sum(value) FROM values S WHERE id_prod=P.id and
date_created>SUBTIME(S.date_created,'01:00:00')) as trendread
FROM prod P ORDER BY name
答案 3 :(得分:0)
我认为这是您要编写的查询:
SELECT p.*,
(SELECT v.value
FROM values v
WHERE v.id_prod = p.id
ORDER BY v.timestamp DESC
LIMIT 1
) as latestread,
(SELECT sum(v.value)
FROM values v
WHERE v.id_prod = p.id and
v.timestamp > SUBTIME(now(), '01:00:00')
) as trendread
FROM prod p
ORDER BY p.name;
这会将所有别名更改为表名的缩写。它还使用now()
修复了最后一小时的表达式,并删除了基于该问题似乎不在任何一个表中的date_created
。该查询方便地假设timestamp
是datetime
。如果它是一个unix时间戳,则需要稍微不同的时间逻辑。
对于values(id_prod, timestamp, value)
上的索引,这应该是合理有效的。