2012-06-22 72 views
0

我的表(例如)查詢最新的唯一結果麻煩試圖從MySQL

id - console - zone - timestamp - temp 
1 - 1  - 1 - 12:00  - 123 
2 - 1  - 1 - 12:01  - 234 
3 - 1  - 1 - 12:02  - 236 
4 - 2  - 1 - 12:01  - 567 
5 - 2  - 1 - 12:02  - 657 
6 - 1  - 2 - 12:00  - 864 
7 - 1  - 2 - 12:02  - 436 

我的表是每30-45秒與各種設備的新數據更新。我的目標是查詢表中的每個主機+區獲得最新的臨時入境(我可以從ID做,因爲這表自動遞增)

理想的輸出將是(例如)

id - console - zone - timestamp - temp 
3 - 1  - 1 - 12:02 - 236 
5 - 2  - 1 - 12:02 - 657 
7 - 1  - 2 - 12:02 - 436 

我試圖在我的查詢中使用max(),但它沒有按照需要執行。我得到最大的ID,但不是從該行的溫度

select max(id), console, zone, timestamp, temp from TABLE group by console, zone order by console, zone; 

上述查詢返回正確數量的條目,但正如我所提到的溫度將不正確。我總是得到表中輸入的第一個溫度值,用於控制檯&區域。我已經看了很多,要麼不知道要問什麼問題,要麼答案很簡單,並且爲了娛樂衆神而避開我。

+0

我定的第一個表,你可以做同樣的第二個?現在必須關閉,但是應該清楚;) – Nanne

回答

1

這就是所謂的檢索什麼作爲一個組相關的最大和它是被撫養長大,因爲直觀的一個非常普遍的問題,你會覺得結合在SELECT使用MAX()GROUP BY會給你的糾正相應的行,但事實並非如此。

相反,您必須在子查詢中包含最大值的選擇,然後在子查詢的最大值等於您想要檢索最大值的任何字段的情況下執行自聯接,以便檢索正確的行:

你的表結構使得該解決方案相當簡單,因爲你的最大基本上是一個獨特的自動遞增ID:

試試這個:

+0

非常感謝你!這工作完美。我在最左邊的領域。在繼續我的這個項目之前,讓我認爲是時候更多地學習MySQL了。 – Klemorali

+0

太棒了!很高興聽到它的工作!而且我認爲你應該繼續工作你的項目,因爲你在實際項目中所面臨的挑戰和掙扎將使你比其他任何學習方法更加直觀地理解SQL。如果您遇到困難,請記住我們總是樂意在S.O.上幫助您。 =) –

+0

+1的解釋。事實上,這是違反直覺的。所以他從第一個查詢中得到的結果不是實際的行,而是來自不同行的混合結果? – Dil

0
select m.mid, m.console, m.zone, timestamp, temp 
from TABLE t 
, (select max(id) mid,console,zone from table group by console,zone) m 
where t.id = m.mid 
and t.zone = m.zone 
and t.console = m.console 
group by m.console, m.zone 
order by 2,3; 
+0

我相信解決方案與Zane類似,儘管起初我很難理解。感謝您的幫助。 – Klemorali