以下のように、ipsの名前のテーブルがあります。
CREATE TABLE `ips` (
`id` int(10) unsigned NOT NULL DEFAULT '0',
`begin_ip_num` int(11) unsigned DEFAULT NULL,
`end_ip_num` int(11) unsigned DEFAULT NULL,
`iso` varchar(3) DEFAULT NULL,
`country` varchar(150) DEFAULT NULL
) ENGINE=InnoDB
以下のように、countryテーブルのこのテーブルにcountryid
フィールドがあるとします。
CREATE TABLE `country` (
`countryid` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`ordering` smallint(5) unsigned NOT NULL DEFAULT '0',
`iso` char(2) NOT NULL,
PRIMARY KEY (`countryid`)
) ENGINE=InnoDB
Ipsテーブルには約100,000件のレコードがあります。次のシナリオのクエリはありますか?ips.iso
がcountry.iso
と等しいかどうかを確認し、等しい場合は、country.coutryidをそのレコードに追加します。どうしようも考えられなかった。それを行う方法について何か考えがありますか?
_UPDATE ips INNER JOIN country
ON ips.iso = country.iso
SET ips.countryid = country.countryid
_
MySQL更新を使用して、複数のテーブル構文:
Iso列には2つの異なる長さとデータ型があることに注意してください。実際には、2文字と3文字の2種類のISOコードセットがあるため、実際にはこれらの列を結合できない場合があります。
結合条件__ON ips.iso = country.iso
_ではなくUSING (iso)
も機能します。
@Cade Rouxのソリューションで構文エラーが発生します。mysql5.5.29の正しいエラーは次のとおりです。
UPDATE ips
INNER JOIN country
ON ips.iso = country.iso
SET ips.countryid = country.countryid
「FROM」キーワードなし。
この構文は読みやすいかもしれません
UPDATE country p, ips pp
SET pp.countryid = p.countryid
WHERE pp.iso = p.iso
@Cadeに感謝しますが、簡単な解決策を見つけました。
update ips set countryid=(select countryid from country where ips.iso=country.iso )