サブネットのテーブルに存在する (指定された 4 ドット形式の IP アドレスの) 最長一致を見つけるための MySQL クエリを作成したいと考えています。
LEFT JOIN
最終的に、別のテーブルの最長一致と結合された 1 つのテーブルにすべての四角形の 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
最小および最大の 10 進形式の IP アドレスです。たとえば、サブネット 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
maximum_ip_value
また、複数の間隔に が含まれている<given ip address>
場合は、最小の間隔 (つまり、最小のサブネット、または最も具体的で「最長」の一致) が結合されます。
最終的に、私が本当に欲しいのは、subnet_id
その間隔に対応する値だけです。
だから私の質問は:
1) 任意の数のパラメータで LEAST() 関数を使用できますか? のすべての行、より具体的にはとsubnets_table
の間のすべての行の間隔を比較し、最小の間隔を選択したいと思います。minimum_ip_value
maximum_ip_value
LEFT JOIN
2)クエリ内でこのすべての計算を実行できますか? 高速でカプセル化され、同じデータの繰り返しのクエリを回避する提案があれば問題ありません。
これを 1 回のクエリで (つまり、各 IP アドレスのサブネット テーブルをクエリせずに) 実行できるかどうか疑問に思っていますが、それを除外するのに十分な知識はありません。これがうまくいかない場合は、別の角度から試すことができるので、お知らせください。
ありがとう。