2011-01-27 7 views
8

У меня есть две таблицы;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-адрес из первой таблицы:

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

В logs.logs, у меня есть все (IP-адрес) набор REMOTE_ADDR, но все записи country_code пусты. Теперь я хочу правильно заполнить COUNTRY_CODE, используя таблицу ipinfo. Как я могу это сделать?

спасибо!

ответ

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 

Если он не говоря типы столбцов должны соответствовать, вы должны изменить таблицу logs.logs так, что столбец REMOTE_ADDR тот же тип (VARCHAR (20)), так как Таблица 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

Редактировать:» re right, max() в исходном ответе, который я предоставил, не мог работать. Вышеупомянутый запрос должен, хотя он, вероятно, будет менее эффективным, чем что-то вроде подхода в приведенном ниже ответе.

+0

Благодарю вас. Я получаю сообщение об ошибке: 'mysql> обновляет logs.logs как l, ipinfo.ip_group_country как c set l.COUNTRY_CODE = max (c.country_code), где c.ip_start <= INET_ATON (l.REMOTE_ADDR); ОШИБКА 1111 (HY000): Недопустимое использование групповой функции. – anon

+0

Простите, что вы правы, я отредактировал ее с чем-то, что должно работать лучше. – nicolaskruchten

+0

спасибо, я буду использовать этот – anon

Смежные вопросы