PHP中的国家总金额来自MYSQL查询

时间:2013-09-10 03:26:33

标签: php jquery mysql sql

我希望得到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

3 个答案:

答案 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范围不重叠的情况下,此查询才会返回准确的结果。