Mám tabulku s názvem ips, jak je uvedeno níže:
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
Předpokládejme, že mám v této tabulce pole countryid
z tabulky zemí, která je uvedena níže:
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
V tabulce ips je asi 100 000 záznamů. Existuje dotaz pro následující scénář:
Zkontrolujte, zda ips.iso
je rovný country.iso
, pokud je to stejné, přidejte do záznamu country.coutryid. Nemohl jsem vymyslet žádný způsob, jak to udělat. Máte představu, jak to udělat?
UPDATE ips INNER JOIN country
ON ips.iso = country.iso
SET ips.countryid = country.countryid
Pomocí MySQL aktualizace více syntaxe tabulky:
Ve sloupcích iso máte dvě různé délky a datové typy. Ve skutečnosti existují dvě oddělené sady kódů ISO, 2-písmenné a 3-písmenné, takže ve skutečnosti nebudete moci připojit tyto sloupce:
Funguje také podmínka spojení USING (iso)
místo ON ips.iso = country.iso
.
Řešení @Cade Roux mi dává chybu syntaxe, správná chyba pro mysql 5.5.29 je:
UPDATE ips
INNER JOIN country
ON ips.iso = country.iso
SET ips.countryid = country.countryid
bez klíčového slova „FROM“.
Tato syntaxe může být lépe čitelná
UPDATE country p, ips pp
SET pp.countryid = p.countryid
WHERE pp.iso = p.iso
díky @Cade, ale našel jsem pro to jednoduché řešení:
update ips set countryid=(select countryid from country where ips.iso=country.iso )