it-swarm-eu.dev

Jak aktualizovat jednu tabulku na základě hodnot jiné tabulky za běhu?

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?

43
ALH
UPDATE ips INNER JOIN country
    ON ips.iso = country.iso
SET ips.countryid = country.countryid

Pomocí MySQL aktualizace více syntaxe tabulky:

14.2.11 UPDATE Syntaxe

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:

ISO 3166-1

Funguje také podmínka spojení USING (iso) místo ON ips.iso = country.iso.

76
Cade Roux

Ř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“.

33
linuxatico

Tato syntaxe může být lépe čitelná

UPDATE country p, ips pp
SET pp.countryid = p.countryid
WHERE pp.iso = p.iso
11
SebastianLasse

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 )
5
ALH