2014-07-03 33 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; 
相关问题