我想創建一個MySQL查詢來查找子網表中存在的最長匹配(四點格式的給定IP地址)。MySQL LEAST()具有任意數量的參數;在表中最長匹配
最終,我想創建一個LEFT JOIN
,它將在一個表中顯示每個四角點IP地址,並與另一個表中的最長匹配進行連接。我不想創建任何臨時表或將其組織爲嵌套查詢。
我有點MySQL的新手,但我在想什麼是這樣的:
SELECT `ip_address`
LEFT JOIN ON
SELECT `subnet_id`
FROM `subnets_table`
WHERE (`maximum_ip_value` - `minimum_ip_value`) =
LEAST(<list of subnet intervals>)
WHERE INET_ATON(<given ip address>) > `minimum_ip_value`
AND INET_ATON(<given ip address>) < `maximum_ip_value`;
這樣minimum_ip_value
和maximum_ip_value
是最低和最高十進制格式的IP在一個給定的地址可能subnet--例如,子網172.16.0.0/16:
minimum_ip_value = 2886729728 (or 172.16.0.0)
maximum_ip_value = 2886795263 (or 172.16.255.255)
而且<list of subnet intervals>
包含subnets_table
所有間隔,其中<given ip address>
是minimum_ip_value
和之間
並且如果不止一個區間包含<given ip address>
,則加入最小間隔(即,最小子網或最具體和「最長」匹配)。
最終,我真正想要的是與該間隔相對應的subnet_id
值。
所以我的問題是:
1)我能用最少的()函數的參數的任意數目?我想比較subnets_table
的每一行,或者更具體地說,每行的間隔爲minimum_ip_value
和maximum_ip_value
,並選擇最小間隔。
2)我可以在LEFT JOIN
查詢中執行所有這些計算嗎?我沒有任何建議,可以快速,封裝,並避免重複查詢相同的數據。
我想知道這是否甚至可以在單個查詢中執行(即不查詢每個ip地址的子網表),但我不知道足以排除。請告知如果這看起來不起作用,所以我可以嘗試另一個角度。
謝謝。
請將您的標籤限制爲您正在使用的RDBMS。對於同樣的問題,MySQL和SQL Server通常需要不同的解決方案。 –