我希望得到Country = Total by IPs Adressen在php查询中已经构建了基础:
$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
=来自colunm中访问者的IP是这个值:636736027
数据库的屏幕截图:
geoip_all表: http://screencloud.net/v/5CgY
task.ip:http://screencloud.net/v/6B0L
答案 0 :(得分: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
我已将您的where
更改为on
声明。您仍然可以在此语句的底部添加实际的where
子句。
您也可以阅读this in depth article,我将如何从多个表中获取数据。它涵盖了连接,内部和外部,聚合以及更多的连接。
答案 1 :(得分: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语句来查询你的表格。
答案 2 :(得分: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)
从屏幕截图中可以看出geoip_all
中的IP范围是否可以重叠。如果是这样,上面的查询可能会为一个任务返回多行。
如果您想要每个国家/地区的任务数量(基于IP地址),最好使用COUNT()
和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范围不重叠的情况下,此查询才会返回准确的结果。