Mysql update alle Zeilen basiert auf der Auswahl aus einer anderen Tabelle
Ich habe zwei Tabellen;
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 | |
+----------------------+------------+------+-----+---------------------+----------------+
Kann ich Land auswählen-code mit ip-Adresse aus der ersten Tabelle:
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 |
+--------------+
In Protokollen.Protokolle habe ich alle die REMOTE_ADDR (ip-Adresse) gesetzt, aber alle COUNTRY_CODE Einträge sind leer. Nun, ich möchte zum Auffüllen COUNTRY_CODE entsprechend mit der ipinfo Tabelle. Wie kann ich dies tun?
Dank!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen
Wenn es nicht gelingt, nämlich die Spalte Typen müssen übereinstimmen, müssen Sie ändern Sie Ihre Protokolle.Protokolle Tisch, so dass Sie den REMOTE_ADDR-Spalte vom gleichen Typ (varchar(20)) als ip_cidr Tabelle.
In einem single-table-update, die Sie verwenden
update t1 set c1=x where y
.In einem multi-table-update, die Sie verwenden
update t1, t2 set t1.c1=t2.c2 where t1.c3=t2.c4
Hier ist die entsprechende Dokumentation http://dev.mysql.com/doc/refman/5.0/en/update.html
Was Sie suchen, ist etwas entlang der Linien von (herausgegeben)
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
Edit: du hast Recht, die max() in der ursprünglichen Antwort, sofern ich nicht arbeiten könnte. Die obige Abfrage soll, obwohl es wird wahrscheinlich werden weniger effizient als so etwas wie der Ansatz in der Antwort unten.
mysql> update logs.logs as l, ipinfo.ip_group_country as c set l.COUNTRY_CODE=max(c.country_code) where c.ip_start <= INET_ATON(l.REMOTE_ADDR); ERROR 1111 (HY000): Invalid use of group function