2011-10-10 69 views
2

我有一個usertable,其中包含一個名爲zip(郵政編碼)的字段 我也有一個基於郵編的緯度,經度值的地理表。基於郵政編碼的MySQL更新

這樣:

usertable 
table_1 contains fields: zip, latitude,longitude (in last 2 fields all values are NULL) 
geotable: 
table_2 contains fields: zip, latitude,longitude 

在TABLE_1該拉鍊碼具有以下格式:1111 AA(4號,2個字母,通常由空字符分割)

在TABLE_2該拉鍊碼具有格式:1111(只有四個數字)

我想了解如何更新查詢應該看起來像?

我想用geotable中的值更新usertable,因此可以在沒有任何聯接的情況下完成搜索查詢。搜索查詢是本網站上最常用的查詢,更新/檢查很少。

在此先感謝您的幫助!

+1

可怕的DB-架構。重新設計它:重複的數據,組合字段與第一範式相反,即 –

+0

,但它不是我的。在usertable中是一個字段zip,我只是添加了一個geotable,並且想要在同一個表中添加geo數據。我只有地理表作爲重複數據表。他們是不使用搜索查詢的地理位置的性能原因。 – Terradon

回答

2

你可以寫

UPDATE table_1 SET 
    latitude = (SELECT latitude FROM table_2 WHERE table_1.zip LIKE CONCAT(table_2.zip, '%')), 
    longitude = (SELECT longitude FROM table_2 WHERE table_1.zip LIKE CONCAT(table_2.zip, '%')); 

不幸的是,我不相信有語法頗爲相似科林提出的建議。您可能會發現,從table_2中首先選擇值並插入它們會更有效。

+0

+1對我來說正常工作:http://www.sqlize.com/a57jbz3Tu6 – mellamokb

+0

感謝[sqlize.com](http://www.sqlize.com/)參考!很有用。 –

+0

我已經使用這個解決方案,似乎工作(值尚未測試,但字段已經更新),但.....我的原始值是小數如:52.35993326000000000000但過期的值只是整數? – Terradon

0

未經檢驗的,我可能沒有語法很正確,但是這是原則:

UPDATE table_1 COLUMNS(latitude, longitude) VALUES (
    SELECT latitude, longitude FROM table_2 
     where table_1.zip LIKE CONCAT(table_2.zip, ' %')); 
1

您可以使用UPDATE ... JOIN條款加入表和執行更新:

update 
    usertable ut inner join geotable gt on 
     ut.zip like concat(gt.zip, '%') 
    set ut.latitude = gt.latitude, 
     ut.longitude = gt.longitude; 

演示:http://www.sqlize.com/398E9CKddr

+0

沒有意識到你可以在'UPDATE'中使用連接。這絕對是一個更好的答案。 –

+0

這一個沒有爲我工作,有0行受到影響。可能是由於「在ut.zip上像concat(gt.zip,'%') 」不幸的是,「ut.zip和gt.zip有不同的格式。所以我認爲內連接因爲這些差異而不起作用? – Terradon

+0

'ut.zip like concat(gt.zip,'%')'表示兩個字段匹配,如果它們包含相同的起始字符。所以'1111 AA'的'ut.zip'將匹配'gt。因爲「ut.zip」的起始字符都與「gt.zip」的整​​個字符串相匹配,所以我相信你的規範是如何定義的。你看過我鏈接的示例代碼嗎?你的數據與示例代碼有什麼不同? – mellamokb