2017-05-08 17 views
8

私はIP範囲のテーブルを持っており、特定の国で拒否するネットワークのリストを生成する必要があります。MySQLのIP範囲からCIDRを選択

私はこれを使用して私のdbからのIP範囲のリストを生成することができます。この結果

ip_from  inet_ntoa(ip_from) ip_to  inet_ntoa(ip_to) 
16777472 1.0.1.0    16778239 1.0.3.255 

を生成しかし、私はCIDR形式でその出力を必要とし、時には範囲が複数の行は次のように返される

SELECT 
     ip_from, 
     Inet_ntoa(ip_from), 
     ip_to, 
     Inet_ntoa(ip_to) 
FROM 
     ip_address_data 
WHERE 
     country_code = 'XX' 
LIMIT 1 

1.0.1.0/24 
1.0.2.0/23 

select文を使用してこれらを動的に生成する方法はありますか?この構文はすばらしいですが、入力行ごとに複数の出力行を返す場合は、ストアドプロシージャでなければならないと仮定しています。

SELECT 
    CONCAT('/sbin/route add -net ', CONVERT_TO_CIDR(ip_from,ip_to), ' reject;') AS command 
FROM 
    ip_info.ip_address_data 
WHERE 
    country_code='XX' 
+1

なぜdownvoteですか?あなたの理由は機能しません。私は意見を探していません、これは私が助けが必要な簡単な数学の問題です。 – jbrahy

+0

この会話は役立つかもしれません。http://stackoverflow.com/questions/595748/is-there-way-to-match-ip-with-ipcidr-straight-from-select-query?rq=1 –

答えて

3

ここに変換を行うためのPythonスクリプトがあります。これをストアドプロシージャに変換するだけです。

Conversion from IP Range to CIDR Mask

+0

。 – jbrahy

+0

SPがPythonと比較される線の数をお知らせください。 –