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...

我下载了 ip2nation 数据库,它可以让我根据 inet_aton_ip 值查找国家:

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# 例程中那样使用一个 sql 而不是两个 sql 来生成上表?我尝试使用子选择和连接,但每次我都被“ip小于x order by ip desc limit 1”部分所抛弃。希望在这里得到 SQL 专家的任何指点。

4

2 回答 2

0

您可以通过使用直接加入表来获取country表。ip2nationINNER JOIN

SELECT  a.*. b.country
FROM    weblog a
        INNER JOIN ip2nation b
            ON a.inet_aton_ip = b.ipp
WHERE   b.ipp < 708657788 
order   by b.ipp

要进一步了解有关联接的更多信息,请访问以下链接:

于 2013-05-06T09:16:57.280 回答
0

如果我们有ip2nation表,那么您可以像这样加入两个表:

SELECT w.*, ip.country
  FROM weblog w
  JOIN ip2nation ip
    ON w.inet_aton_ip = ip.ipp

输出:

╔════╦════════════════════════════╦═════════╦══════════════╦══════════════╦═════════╗
║ ID ║          LOGDATE           ║ BROWSER ║    IPADDR    ║ INET_ATON_IP ║ COUNTRY ║
╠════╬════════════════════════════╬═════════╬══════════════╬══════════════╬═════════╣
║  1 ║ May, 01 2013 00:00:00+0000 ║ Chrome  ║ 42.61.66.124 ║    708657788 ║ sg      ║
║  2 ║ May, 01 2013 00:00:00+0000 ║ Chrome  ║ 217.9.192.99 ║   3641294848 ║ uk      ║
║  3 ║ May, 02 2013 00:00:00+0000 ║ Firefox ║ 77.79.58.77  ║   1297037901 ║ lt      ║
╚════╩════════════════════════════╩═════════╩══════════════╩══════════════╩═════════╝

看到这个 SQLFiddle

于 2013-05-06T09:16:40.867 回答