0

我想在 php 查询中获得 Country = Total by IPs Adressen 已经建立了基础:

$result = mysql_query("SELECT t.*, gi.cname FROM tasks t LEFT JOIN geoip_all gi WHERE t.ip > geoip_all.iplong_start &&  t.ip < geoip_all.iplong_end", $link);
$county = mysql_num_rows($result);

echo "<p>County:\n $county</p> ";

到目前为止,我进行了此查询,但它不起作用。

SELECT t.*, gi.cname FROM tasks t LEFT JOIN geoip_all gi WHERE t.ip > geoip_all.iplong_start &&  t.ip < geoip_all.iplong_end

来自 phpmyadmin 中运行的查询的错误消息:

1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'JOIN geoip_all.cname LIMIT 0, 30' at line 1

geoip_all.cname= 国家名称 geoip_all.iplong_start= ip 范围的 geoip_all.iplong_end开始 = ip 范围的开始 task.ip= 来自该列中访问者的 IP 是这个值:636736027

数据库截图:

geoip_all 表: http ://screencloud.net/v/5CgY

任务.ip: http ://screencloud.net/v/6B0L

4

3 回答 3

0

您可能想要使用包容性比较(例如,当 IP 地址为 时匹配1.0.0.0

SELECT t.*, gi.cname
FROM tasks t
LEFT JOIN geoip_all gi ON (t.ip BETWEEN gi.iplong_start AND gi.iplong_end)

从您的屏幕截图中不清楚 IP 范围是否geoip_all可以重叠。如果是这样,上述查询可能会为一项任务返回多行。


如果您想要每个国家/地区的任务数(基于 IP 地址),您最好使用COUNT()and GROUP BY。就像是,

SELECT gi.cname, COUNT(*)
FROM tasks t
LEFT JOIN geoip_all gi ON (t.ip BETWEEN gi.iplong_start AND gi.iplong_end)
GROUP BY 1

同样,仅当 IP 范围保证不重叠时,此查询才会返回准确的结果。

于 2013-09-10T04:31:08.883 回答
0

看起来您可能在语句中混淆了 ANSI 89 和 92 语法

SELECT 
    t.*, 
    gi.cname 
FROM 
    tasks t 
        LEFT JOIN geoip_all gi 
            on t.ip > gi.iplong_start 
            and  t.ip < gi.iplong_end

我已将您的更改whereon声明。不过,您仍然可以where在该语句的底部添加一个实际的子句。

你也可以好好阅读这篇我整理的关于如何从多个表中获取数据的深入文章。它涵盖了连接、内部和外部、聚合等等。

于 2013-09-10T03:34:35.210 回答
0

改变

SELECT t.*, gi.cname FROM tasks t LEFT JOIN geoip_all gi WHERE t.ip > geoip_all.iplong_start &&  t.ip < geoip_all.iplong_end

至:

SELECT t.*, gi.cname FROM tasks AS t LEFT JOIN geoip_all AS gi WHERE t.ip > geoip_all.iplong_start &&  t.ip < geoip_all.iplong_end;

我相信您缺少 AS 语句来查询您的表作为某些东西。

于 2013-09-10T03:35:56.360 回答