0

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開始 task.ip= IP 範囲の開始 = 列の訪問者からの IP は、この値です: 636736027

データベースのスクリーンショット:

geoip_all テーブル: http://screencloud.net/v/5CgY

task.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が重複する可能性があるかどうかは、スクリーンショットからは明らかではありません。その場合、上記のクエリは 1 つのタスクに対して複数の行を返すことがあります。


各国の (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 範囲が重複しないことが保証されている場合にのみ正確な結果を返します。

于 2013-09-10T04:31:08.883 に答える