0

サブネットのテーブルに存在する (指定された 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_valuemaximum_ip_value

また、複数の間隔に が含まれている<given ip address>場合は、最小の間隔 (つまり、最小のサブネット、または最も具体的で「最長」の一致) が結合されます。

最終的に、私が本当に欲しいのは、subnet_idその間隔に対応する値だけです。

だから私の質問は:

1) 任意の数のパラメータで LEAST() 関数を使用できますか? のすべての行、より具体的にはとsubnets_tableの間のすべての行の間隔を比較し、最小の間隔を選択したいと思います。minimum_ip_valuemaximum_ip_value

LEFT JOIN2)クエリ内でこのすべての計算を実行できますか? 高速でカプセル化され、同じデータの繰り返しのクエリを回避する提案があれば問題ありません。

これを 1 回のクエリで (つまり、各 IP アドレスのサブネット テーブルをクエリせずに) 実行できるかどうか疑問に思っていますが、それを除外するのに十分な知識はありません。これがうまくいかない場合は、別の角度から試すことができるので、お知らせください。

ありがとう。

4

1 に答える 1

0

いくつかの調査と試行錯誤の後、上記のプロトタイプ クエリにはいくつかの問題があることがわかりました。

このLEAST()関数は、設定された数の引数のみを取ります。私の元の質問によると、任意の数の引数、またはテーブル内のすべての行で機能する関数が必要です。これは、MySQL では別の機能MIN()です。

この関数はMySQLMIN()の関数よりも優先順位が低く、任意のクエリで関数の後に評価されます。したがって、が実行された時点ではまだ存在しないため、一連の値を使用することはできません。JOINJOINJOINMIN()MIN()JOIN

この問題を解決する唯一の方法は、2 つの別個のクエリを実行することでした。1 つは をMIN()最初に実行し、もう 1つJOINは を最初のクエリの結果に対して実行しました。これは、 n行のテーブルの場合、 nクエリではなくn ^ nクエリを実行することを意味します。それは受け入れられませんでした。

この問題を回避するために、これらのクエリが実行される前にデータベースを変更する新しいスクリプトを作成しました。各サブネットには独自の IP 値の「バケット」が与えられ、その範囲内のすべての値がそのサブネットにマップされます。より具体的な (つまり、より小さな) サブネットが、より具体的でない (つまり、より大きな) サブネットとオーバーラップする場合、より具体的な範囲はより小さなサブネットにのみマップされ、より大きなサブネットはより具体的でない範囲の値のみを保持します。現在、特定の IP アドレスは 1 つの「バケット」にのみ分類され、最も具体的な一致である 1 つのサブネットのみにマップされます。私はJOINこの試合に参加でき、機能について心配する必要はありませんMIN()

于 2016-06-06T14:28:21.380 に答える