【问题标题】:Normalizing MySQL table with records of another table用另一个表的记录规范化 MySQL 表
【发布时间】:2011-11-27 09:23:31
【问题描述】:

我有 2 张桌子。城市表没有标准化,因为国家信息是纯文本的。我已将 id_country 添加到“城市”表中(该列为空)。

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

城市表

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

国家/地区表

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

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

【问题讨论】:

    标签: mysql normalization


    【解决方案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,您可以从 city 表中删除该列。

    【讨论】:

    • 完成! 3500 条记录,81 条没有国家。你为我节省了很多时间。谢谢!
    【解决方案2】:

    城市表没有标准化,因为国家信息是 纯文本。

    废话。规范化并不意味着“用 ID 号替换纯文本”。找到教你的人,用锋利的棍子戳他的眼睛。

    您的真正问题是“城市”加上“国家”不足以识别城市,至少在美国是这样。我认为美国至少有十几个不同的城市命名为“华盛顿”。

    与其用身份证号码替换国家名称,不如用两个字母的国家代码替换它。代码是人类可读的;在使用您的城市表的每个查询中,ID 号都需要额外的 JOIN。

    【讨论】:

    • 不完全。它本身不是“城市”表,我更改了表的名称以避免混淆。这是一个机场表,其中每个机场位于特定城市。 id_country 仅用于放置国家标志。
    • "我更改了表的名称以避免混淆。"啊。要是那行得通就好了。 ;)
    【解决方案3】:

    这样的事情应该可以工作:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-26
      • 1970-01-01
      • 1970-01-01
      • 2021-07-03
      • 2017-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多