2014-07-03 34 views
0

我有一個表node_weather,看起來像這樣:MySQL - 如何檢索由其中一個字段分組的最後記錄值?

+--------------------+--------------+------+-----+--------------------+ 
| Field    | Type   | Null | Key |     | 
+--------------------+--------------+------+-----+--------------------+ 
| W_id    | mediumint(9) | NO | PRI | ement    | 
| temperature  | int(10)  | YES |  |     | 
| humidity   | int(10)  | YES |  |     | 
| wind_direction  | int(10)  | YES |  |     | 
| wind_speed   | int(10)  | YES |  |     | 
| wet_temperature | int(10)  | YES |  |     | 
| P_id    | mediumint(9) | YES | MUL |     | 
| time    | timestamp | NO |  | CURRENT_TIMESTAMP | 
| level_current  | int(10)  | YES |  | 

在此表中,我記錄從4個不同的氣象站的數據,通過P_ID字段(定義=> P_ID可以是值1,2的, 3或4)。這些數據連續不斷地填滿了來自所有車站的表格。

如何創建查詢以獲取每個氣象站的最後記錄行?

回答

2

也許是這樣的:

SELECT 
    * 
FROM 
    node_weather 
JOIN 
(
    SELECT 
     tblInner.P_id, 
     MAX(tblInner.time) AS maxTime 
    FROM 
     node_weather as tblInner 
    GROUP BY 
     tblInner.P_id 
) AS tblMax 
    ON tblMax.maxTime = node_weather.time 
    AND tblMax.P_id = node_weather.P_id 

這將得到最新的組合,最大timeP_id

+0

謝謝。我想了很長一段時間,但想用GROUP BY/ORDER BY簡單地處理它,而不使用子查詢(認爲它必須像那樣工作)。正如我所看到的,子查詢是需要的。 – MichalB

+0

有一個問題 - 當我單獨執行一個子查詢時,我會得到一個奇怪的結果 - 奇怪的是,查詢的時間沒有響應結果集中對應於那個時間的其他行 - 爲什麼會這樣? – MichalB

0

SELECT * FROM node_weather GROUP BY P_id ORDER BY time DESC

這應該做的伎倆

+0

不是真的,它只是按時間降序排列最終結果集,但分組不會按照時間完成。 – MichalB

+0

我不知道我是否理解你的問題,然後,你想從每個氣象站(P_id)的最後記錄?這就是爲什麼我做了一個GROUP BY,然後爲了確保獲得最新的記錄,我按時排序。 該代碼雖然未經測試,但它應該可以工作。 – Caweren

+0

我已經測試過它,它不給我我想要的。重點在於,當您按時間排序時,您已經在使用分組結果集。我需要的是首先按時間順序排列整個結果集,然後在其中找到每個氣象站的最新記錄並給予並返回。 – MichalB

1

嘗試此查詢。它比子查詢更快..

select nw1.* from node_weather nw1 
LEFT JOIN node_weather nw2 on nw2.P_id = nw1.P_id and nw2.time>nw1.time 
where nw2.W_ID is null; 
相關問題