私のウェブサイトへの訪問をキャプチャするウェブログがあります。
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の専門家からのポインタをいただければ幸いです。