MySQL,使用GROUP BY

时间:2016-08-25 20:03:58

标签: mysql group-by subquery

我有一个包含表“MySQL_route”的MySQL数据库。此表跟踪设备的消息在找到调制解调器并进入互联网之前所使用的集线器之间的路径。

“message_route”包含以下列:

id, summary_id, device_id, hub_address, hop_count, event_time

表中的每一行代表两个集线器之间的单个“跳”。列"device_id"给出了消息源自的设备的ID。列"hub_address"给出了收到消息跳的集线器的id,"hop_count"递增计算这些跃点。消息的完整路由由"summary_id"密钥绑定在一起。表格的一小部分用于说明:

+-----+------------+-----------+-------------+-----------+---------------------+
| id  | summary_id | device_id | hub_address | hop_count | event_time          |
+-----+------------+-----------+-------------+-----------+---------------------+
| 180 |        158 |      1099 |       31527 |         1 | 2011-10-01 04:50:53 |
| 181 |        159 |      1676 |       51778 |         1 | 2011-10-01 00:12:04 |
| 182 |        159 |      1676 |       43567 |         2 | 2011-10-01 00:12:04 |
| 183 |        159 |      1676 |       33805 |         3 | 2011-10-01 00:12:04 |
| 184 |        160 |      2326 |       37575 |         1 | 2011-10-01 00:12:07 |
| 185 |        160 |      2326 |       48024 |         2 | 2011-10-01 00:12:07 |
| 186 |        160 |      2326 |       57652 |         3 | 2011-10-01 00:12:07 |
+-----+------------+-----------+-------------+-----------+---------------------+

此处共有三条消息。 summary_id = 158的消息在找到调制解调器之前仅触及了一个集线器,因此带有id = 180的行是该消息的整个记录​​。 Summary_ids 159160每个都有3个跃点,每个跃点触及3个不同的集线器。邮件的跳数没有上限。

我需要创建一个MySQL查询,它给出了构成消息最后一跳的唯一“hub_address”值列表。换句话说,hub_address与每个summary_id的最大hop_count相关联。使用上面的数据库代码段,输出应为"31527, 33805, 57652"

我一直无法弄清楚这一点。与此同时,我使用此代码作为代理,它仅为我提供了具有单跳的消息的唯一hub_address值,例如summary_id = 158

SELECT DISTINCT(x.hub_address)
FROM (SELECT hub_address, COUNT(summary_id) AS freq  
    FROM message_route GROUP BY summary_id) AS x
WHERE x.freq = 1;

1 个答案:

答案 0 :(得分:2)

我会这样做:

select distinct mr.hub_address
from message_route mr
where mr.event_time = (select max(mr2.event_time)
                       from message_route mr2
                       where mr2.summary_id = mr.summary_id
                      );