2011-01-27 4 views
8

J'ai deux tabels;Mysql mettre à jour toutes les lignes en fonction de sélectionner dans une autre table

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    |    | 
+----------------------+------------+------+-----+---------------------+----------------+ 

Je peux sélectionner le code de pays en utilisant l'adresse IP de première table:

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   | 
+--------------+ 

En logs.logs, j'ai tous les REMOTE_ADDR (adresse ip) ensemble, mais toutes les entrées de COUNTRY_CODE sont vides. Maintenant, je veux remplir COUNTRY_CODE de manière appropriée en utilisant la table ipinfo. Comment puis-je faire ceci?

merci!

Répondre

9

Essayez

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 

Si elle échoue disant que les types de colonnes doivent correspondre, vous devrez modifier votre table logs.logs de telle sorte que la colonne REMOTE_ADDR est du même type (varchar (20)) comme table ip_cidr.

8

Dans une mise à jour à table unique, vous utilisez update t1 set c1=x where y.

Dans une utilisation update t1, t2 set t1.c1=t2.c2 where t1.c3=t2.c4

mise à jour multi-table Voici la documentation pertinente http://dev.mysql.com/doc/refman/5.0/en/update.html

Qu'est-ce que vous cherchez est quelque chose le long des lignes de (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

Modifier: » re droit, le max() dans la réponse d'origine que j'ai fourni ne pouvait pas fonctionner. La requête ci-dessus devrait, bien qu'elle sera probablement moins efficace que quelque chose comme l'approche dans la réponse fournie ci-dessous.

+0

merci. Je reçois une erreur: mysql met à jour logs.logs comme l, ipinfo.ip_group_country comme c set l.COUNTRY_CODE = max (c.country_code) où c.ip_start <= INET_ATON (l.REMOTE_ADDR); ERREUR 1111 (HY000): Utilisation incorrecte de la fonction de groupe – anon

+0

Désolé, vous avez raison, je l'ai édité avec quelque chose qui devrait fonctionner mieux. – nicolaskruchten

+0

merci, je vais utiliser celui-là – anon

Questions connexes