2014-02-17 28 views
0

我想返回一個產品連同其最新值和最近一小時的值。mysql:獲取最新的值和前一小時的值的總和

我有一個產品表:

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 

但這種失敗, 「未知列 'S.date_created' 在 'where子句'」

有什麼建議?

回答

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 
+0

@AgRizzo我更新了我的答案 –

+0

是的,這讓它爲我工作。但是,如果我不更改「SELECT max(date_created)FROM values WHERE product_id = v2.product_id」到「SELECT max(date_created)FROM values WHERE product_id = 99」(其中99是產品的實際ID)我查詢)。我不明白爲什麼...但無論如何,現在它的工作! Thx – johnjohn22

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 
1

阿萊克斯g^mhasan給出瞭解決方案,但不是這個失敗的原因。這失敗的原因是因爲別名S在子查詢內部是未知的。子查詢不瞭解其範圍之外的表。

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這似乎不在任一表中。該查詢方便地假定timestampdatetime。如果它是一個unix時間戳,則需要稍微不同的時間邏輯。

這應該是合理的效率與values(id_prod, timestamp, value)索引。

相關問題