2011-01-27 12 views
8

私は2つのタブを持っています。Mysqlは別のテーブルからの選択に基づいてすべての行を更新します

mysql> describe ipinfo.ip_group_country; 
+--------------+-------------+------+-----+---------+-------+ 
| Field  | Type  | Null | Key | Default | Extra | 
+--------------+-------------+------+-----+---------+-------+ 
| ip_start  | bigint(20) | NO | PRI | NULL |  | 
| ip_cidr  | varchar(20) | NO |  | NULL |  | 
| country_code | varchar(2) | NO | MUL | NULL |  | 
| country_name | varchar(64) | NO |  | NULL |  | 
+--------------+-------------+------+-----+---------+-------+ 

mysql> describe logs.logs; 
+----------------------+------------+------+-----+---------------------+----------------+ 
| Field    | Type  | Null | Key | Default    | Extra   | 
+----------------------+------------+------+-----+---------------------+----------------+ 
| id     | int(11) | NO | PRI | NULL    | auto_increment | 
| ts     | timestamp | NO |  | CURRENT_TIMESTAMP |    | 
| REMOTE_ADDR   | tinytext | NO |  | NULL    |    | 
| COUNTRY_CODE   | char(2) | NO |  | NULL    |    | 
+----------------------+------------+------+-----+---------------------+----------------+ 

私は最初のテーブルからIPアドレスを使用して国コードを選択することができます。logs.logsで

mysql> SELECT country_code FROM ipinfo.`ip_group_country` where `ip_start` <= INET_ATON('74.125.45.100') order by ip_start desc limit 1; 
+--------------+ 
| country_code | 
+--------------+ 
| US   | 
+--------------+ 

、私はすべてのREMOTE_ADDR(IPアドレス)が設定されているが、すべてのCOUNTRY_CODEエントリが空です。これで、ipinfoテーブルを使用してCOUNTRY_CODEを適切に設定します。これどうやってするの?

ありがとうございました!

答えて

9

として、それは、列の型が一致しなければならないと言って失敗した場合REMOTE_ADDR列が同じタイプ(VARCHAR(20))であるように、あなたはlogs.logsテーブルを変更する必要があります

UPDATE logs.logs 
SET COUNTRY_CODE = (
    SELECT country_code 
    FROM ipinfo.ip_group_country 
    WHERE ipinfo.ip_start <= INET_ATON(logs.REMOTE_ADDR) 
    LIMIT 1 
) 
WHERE COUNTRY_CODE IS NULL 

をお試しくださいip_cidrテーブル。

8

単一テーブルの更新では、update t1 set c1=x where yを使用します。

あなたはupdate t1, t2 set t1.c1=t2.c2 where t1.c3=t2.c4

を使用したマルチテーブル更新ではここに関連する文書は、あなたが探しているものhttp://dev.mysql.com/doc/refman/5.0/en/update.html

です(editted)の線に沿って何かあるupdate logs.logs as l, ipinfo.ip_group_country as c set l.COUNTRY_CODE=c.country_code where c.ip_start <= INET_ATON(l.REMOTE_ADDR) order by c.ip_start asc

編集:」私が提供した元の答えのmax()は機能しませんでした。上記のクエリは、下記の答えのアプローチのようなものよりも効率が低い可能性があります。

+0

ありがとうございます。 L、Cセットl.COUNTRY_CODE = MAX(c.country_code)c.ip_start <= INET_ATON(l.REMOTE_ADDR)としてipinfo.ip_group_countryとして 'のMySQL>更新logs.logs;:私はエラーを取得します ERROR 1111(HY000):そのことについて申し訳ありません – anon

+0

function'グループの不正な使用は、あなたが正しい、私はより良い動作するはず何かでそれをedittedました。 – nicolaskruchten

+0

ありがとう、私はその1つを使用します – anon

関連する問題