2012-06-22 34 views
0

我的mysql表有一個cityname列。 cityname列中的值存在一些拼寫錯誤。每個城市的拼寫錯誤都需要糾正。另一個表中有一列包含所有正確的城市名稱。根據這個表格,第一個表格的拼寫錯誤需要糾正。我研究了諸如soundex之類的東西,但找不到任何類似的鏈接。根據mysql中的另一個表更正列中的拼寫錯誤

TableA 

+----+------------+----------+ 
| id | col1  | city_name | 
+----+------------+----------+ 


TableB 

+----+------------+-- 
| index |City_name  | 
+----+------------+-- 

我在腦海遇到的做法是,讓創建單獨的表中哪些有發音相似的城市名行的SQL查詢。

一旦做到這一點與那些正確再次使用一個SQL查詢

最後所有不同的表合併爲一個表的所有修正拼寫錯誤的替換拼寫。

我既在方法上,以及MySQL查詢語法尋求建議

+0

你可能要考慮Levenstein距離,而不是SoundEx http://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance – spencer7593

+0

查找Levenshtein距離。這是在20世紀60年代爲處理拼寫錯誤而開發的算法。這張貼可能會幫助你http://stackoverflow.com/questions/560709/levenshtein-distance-in-t-sql。 –

+0

[這是另一個很好的問題](http://stackoverflow.com/questions/42013/levenshtein-distance-based-methods-vs-soundex)上使用Levenshtein距離而不是soundex。 –

回答

3

有將要被一些體力勞動參與,構建前端它可能不是麻煩,如果這是一個時間事情。

我會做的是以下幾點:

  1. 生成所有拼寫錯誤的列表。
  2. 基於soundex生成建議
  3. 手動檢查列表,手動選擇正確的,並且每次修復都手動運行更新語句。

那麼,如何才能做到這一點:

SELECT * FROM TableA as orig 
LEFT OUTER JOIN 
TableB as correct 
ON SOUNDEX(orig.city_name) = SOUNDEX(correct.city_name) 
WHERE orig.City_name NOT IN (SELECT City_name FROM TableB) 

和手工編寫的更新語句。你可能不會通過soundex得到任何建議,或者得到多個選擇,你將不得不自己解決。電腦不是那麼聰明。

+0

子查詢 – silverkid

+0

OK流汗錯誤未知列tableA.city_name這個固定SELECT * FROM TableA的 LEFT OUTER JOIN表B ON SOUNDEX(tableA.city_name)= SOUNDEX(tableB.city_name) WHERE tableA.City_name NOT IN(SELECT CITY_NAME FROM表B ) – silverkid

+0

謝謝,我忽略了。我在修改中修正了它稍有不同,以使用別名。事情往往會從IMO的別名中得到更清楚的理解,但是再一次,你的表不叫做'TableA'和'TableB'(或者至少我希望它們不會!) – Martijn

相關問題