1

私のウェブサイトへの訪問をキャプチャするウェブログがあります。

Table weblog
id  logdate    browser  ipaddr         inet_aton_ip
 1  2013-05-01 Chrome   42.61.66.124      708657788
 2  2013-05-01 Chrome   217.9.192.99     3641294848
 3  2013-05-02 Firefox  77.79.58.77      1297037901
...etc...

inet_aton_ip 値に基づいて国を検索できる ip2nation データベースをダウンロードしました。

mysql> select * from ip2nation where ip<708657788 order by ip desc limit 1;
+-----------+---------+
| ip        | country |
+-----------+---------+
| 708575232 | sg      |
+-----------+---------+
mysql> select * from ip2nation where ip<3641294848 order by ip desc limit 1;
+------------+---------+
| ip         | country |
+------------+---------+
| 3641286656 | uk      |
+------------+---------+
... and so on ...

ip2nation の ip 列は IP 境界をマークするため、検索は正確ではありません。つまり、等しい比較は機能しません。42.61.66.x のようなサブネットの場合、255 の同様のエントリをリストする必要がないため、この構造は理にかなっています。

次のような C# ルーチンを使用する

DataTable dt = [a sql function to select * from weblog]
foreach (DataRow row in dt.Rows)
{
     long ipnum = int.Parse(row["inet_aton_ip"].ToString());
     string cty = [a sql function to select country using ipnum]
}

次の表を取得できます。

id  logdate    browser  ipaddr         inet_aton_ip  country
 1  2013-05-01 Chrome   42.61.66.124      708657788  sg
 2  2013-05-01 Chrome   217.9.192.99     3641294848  uk
 3  2013-05-02 Firefox  77.79.58.77      1297037901  lt

C# ルーチンのように、2 つの SQL ではなく 1 つの SQL を使用して上記のテーブルを生成できるのでしょうか? サブセレクトとジョインで遊んでみましたが、毎回「ip desc limit 1 による x 未満の ip オーダー」の部分に悩まされます。ここでSQLの専門家からのポインタをいただければ幸いです。

4

2 に答える 2