2011-09-29 25 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

相關問題