Mysql根据另一个表中的select更新所有行

ano*_*non 8 mysql select

我有两个表格;

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                |                |
+----------------------+------------+------+-----+---------------------+----------------+
Run Code Online (Sandbox Code Playgroud)

我可以使用第一个表中的ip地址选择国家代码:

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           |
+--------------+
Run Code Online (Sandbox Code Playgroud)

在logs.logs中,我设置了所有REMOTE_ADDR(IP地址),但所有COUNTRY_CODE条目都为空.现在,我想使用ipinfo表适当地填充COUNTRY_CODE.我怎样才能做到这一点?

谢谢!

Dea*_*her 9

尝试

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
Run Code Online (Sandbox Code Playgroud)

如果说列类型必须匹配失败,则必须更改logs.logs表,以便REMOTE_ADDR列与ip_cidr表的类型相同(varchar(20)).


nic*_*ten 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

您正在寻找的是(编辑)的东西 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()无法正常工作.上面的查询应该是,虽然它可能不如下面提供的答案中的方法那样有效.