2016-08-25 26 views
0

我有一個包含表「message_route」的MySQL數據庫。該表追蹤了設備發出的消息在發現調制解調器之後到達互聯網的集線器之間的路徑。MySQL,使用GROUP BY確定與另一個值MAX()相關的值

「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; 

回答

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

這似乎這樣的伎倆!感謝您幫我解決問題,我認爲「GROUP BY」是解決問題的必要條件。 – OnlyDean