2011-07-20 7 views
3

私は訪問者のIPアドレスを記録するテーブルを持っています。このテーブルはcrm_recordGeoIP国のデータベースからMySQLテーブルの国のフィールドを更新

という名前で私はmaxmindデータベースに

SELECT country_name 
FROM crm_geo_country 
WHERE INET_ATON("82.145.208.23") BETWEEN beginip AND endip 
を照会するために、このクエリを知っているこの表から

をMaxmindのGeoIP国のデータベースをダウンロードしてcrm_recordに国フィールドを更新したいしています

しかし、crm_recountの国フィールドをcrm_geo_countryから更新できるようにするUPDATEクエリの構文が必要です

答えて

1
UPDATE crm_record r 
JOIN crm_geo_country gc 
ON  INET_ATON(r.address) BETWEEN gc.beginip AND gc.endip 
SET  r.country = gc.country_name 

これは非常に非効率的であることに注意してください。

ジオイドテーブルを変更して範囲を格納するための空間フィールドを使用するように、IPアドレスを数値形式で保存する必要があります。

+0

すごい、このような高速回答ありがとう!私はあなたが効率について何を意味しているかを見ます。両方のテーブルに数値形式で保存する必要がありますか? –

+0

@Michael:はい、 'crm_record.address'にインデックスを作成します。しかし、 'crm_geo_country'は常にクエリの中で先行していますが、それはかなり大きいので良くありません。代わりに 'crm_geo_country'に範囲を' LineString'として格納することを検討してください。詳細についてはこちらを参照してください。http://explainextended.com/2009/04/04/banning-ips/ – Quassnoi

+0

もう一度おねがいします。ところで、あなたはフリーの仕事をしていますか? –

関連する問題