2011-09-29 24 views
1

我有2个表。由于国家信息是纯文本的,所以城市表格没有正常化。我已将id_country添加到“城市”表(该列为空)。正常化MySQL表与另一个表的记录

我需要检查城市>国家国家>国家之间的匹配,然后更新与该国表id_country相匹配的城市记录。最后,我将能够从城市表中删除“国家”列。

市台

  • id_city(1,2,3 ...)
  • 市(华盛顿,瓜亚基尔,波恩...)
  • 国家(德国,厄瓜多尔,美国。 ..)
  • id_country(目前为空)

Country表

  • id_country(1,2,3,...)
  • 代码(GE,EC,US ...)
  • 国家(德国,厄瓜多尔,美国...)

我不知道从哪里开始,如果可以用SQL查询完成。我最初的想法是在php循环中搜索匹配,但这似乎是一个非常困难的实现。

回答

1

您可以在一个UPDATE语句JOIN做到这一点。

UPDATE city c1 INNER JOIN country c2 ON c1.country=c2.country 
SET c1.id_country=c2.id_country; 

使用的INNER JOIN将确保更新只发生于具有匹配的国家城市价值。

一旦你运行它,你将能够选择所有仍然有空id_country的城市,以防万一他们不匹配。相反,一旦您确定所有的城市都有id_country,您可以从城市表中删除该列。

+0

完成! 3500条记录,81个国家没有国家。你为我节省了很多时间。谢谢! – andufo

0

像这样的东西应该工作:

UPDATE city set id_country = (SELECT country.id_country from country WHERE country.country = city.country) 
1

全市表,因为国家信息为明文 不归。

废话。规范化并不意味着“用纯数字替换纯文本”。找出谁教你,并用尖锐的棍子戳他的眼睛。

Your real问题在于“城市”加“国家”不足以识别城市,至少在美国是如此。我认为美国至少有十二个不同的城市被命名为“华盛顿”。

而不是用id号替换国家/地区名称,而是用两个字母的国家/地区代码代替国家/地区代替它。代码是人类可读的;在使用城市表的每个查询中,ID号码都需要额外的JOIN。

+0

不完全。它本身不是“城市”表格,为了避免混淆,我改变了表格名称。它是机场的一张桌子,每个机场都在特定的城市。 id_country仅用于放置国旗。 – andufo

+0

“我改变了表名,以避免混淆。”啊。如果只有这个工作。 ;) –

+0

它确实为zombat工作。 – andufo

相关问题