2012-12-11 29 views
0

更新更換與其結構一致,但是需要刪除的數據中存在一些髒污,如H.NO , H#, H.NO. should be = HNO: 我正在使用存儲過程的方法。我在其中創建了一個錯誤值的查找表,並用正確的值替換它們,以便最終存儲的數據應該是完美的。如果陣列對應列

我必須檢測數據庫表中的錯誤值,並用正確的值替換它們。


我已經創建了一個陣列$find[]是存儲從DB來值,然後有一個可變$exist,其中我想檢查它是否在$find[wrong]陣列(列)的存在與否。如果確實如此,則其值會被替換爲相應的數值$find[right]。請讓我知道我該如何做這種替換。謝謝,

注:我的數據庫表中只包含兩個命名爲wrong and right

當我甩我$find陣列列它給了我下面的輸出: Array ([0] => Array ([0] => FSc [wrong] => FSc [1] => FSC [right] => FSC) [1] => Array ([0] => Fsc [wrong] => Fsc [1] => FSC [right] => FSC)

CODE:

$lookup = mysql_query("select * from lookup"); 
while($getlookup = mysql_fetch_array($lookup)) 
{ 
$find[] = $getlookup; 
} 
print_r($find); 
+2

你究竟在做什麼?肯定有一種「正確」和「錯誤」的方式來解決這個問題,我擔心你選擇了錯誤的方式。你只是試圖得到'right'的值,它存在於數據庫中的'wrong'的給定值等於'$ exists'? –

+0

@MikeBrant是的,你是對的 –

回答

1

確定你需要簡單的查詢更改爲此

"SELECT right FROM lookup WHERE wrong = '" . $exists . "'" 

這將返回0行,如果沒有匹配。或者一個(或更多行取決於如何設置表格)如果匹配。

您應該在wrong字段上有一個索引來優化查詢。如果對於任何值wrong(即,wrong在每一行中都是唯一的)應該只有一個具體值right,則使wrong成爲唯一索引以強制其唯一性。


更新的答案,以配合您的問題修訂。我要做的只是使用SQL查詢來更新映射表中的錯誤數據。

所以我假設你DB結構可以是這個樣子:

the_table 
--------- 
the_field (the field you are trying to change) 
... some other fields 

mapping_table 
--------- 
wrong 
right 

那麼你就需要運行更新查詢與消毒值的表想這

UPDATE the_table AS t 
INNER JOIN mapping_table AS mt ON t.the_field = mt.wrong 
SET bt.the_field = mt.right 

這會將表格更新爲新的值。顯然,如果你不想改變表格的位置,你可以製作表格副本,然後對該表格副本運行該查詢。

+0

實際上,我正在執行數據清理,所以我創建了一個查詢表,其中有各種其他字段,我想要替換,所以我想如果我將它們存儲到數組,然後檢查,以便我可以更快地獲得結果,導致我我正在處理來自數據庫的〜50K行,並需要清理髒數據 –

+0

請讓我知道你的觀點我做的是正確的方式或我應該使用其他一些技巧,目前我正在做的是上傳文件並將其轉儲到我的數據庫中,然後從數據庫中獲取值並在其上執行清理... –

+0

如果這是一次數據遷移,那麼這肯定是錯誤的方法。即使涉及到PHP,您也可能會打包執行任何您需要的任何操作。如果你可以澄清你在你的問題中想要做什麼,那麼我確信可以提供幫助。 –

1

解決在MySQL本身。當retreiving:

SELECT right, IF(wrong='$exist',right,wrong) as wrong from lookup 

當然,使用PDO &準備語句而不是mysql_ *,或非常小心逃逸變量。

但是,如果「錯誤」的數據需要去:

UPDATE data_to_fix 
LEFT JOIN lookup l1 
ON data_to_fix.some_field1 LIKE l1.wrong 
LEFT JOIN lookup l2 
ON data_to_fix.some_field2 LIKE l2.wrong 
SET 
    data_to_fix.some_field1 = IFNULL(l1.right, data_to_fix.some_field1), 
    data_to_fix.some_field2 = IFNULL(l2.right, data_to_fix.some_field2); 
+0

所以這種技術將運行在O(1)?因爲我正在處理〜50K行,我必須再次查找.. –

+0

如果您需要永久更新它們...只需在cron下運行UPDATE查詢(我將添加答案),應該足夠快。如果「錯誤」的數據不斷出現,MYSQL中的BEFORE INSERT/BEFORE UPDATE觸發器可能會處於有序狀態,完全無需定期修復。 – Wrikken

+0

+1,你的更新很不錯,實際上像'H'這樣的字段中有一些字符串。號碼地址...'因此從這樣的字符串中我必須替換'H.只有HNO的部分#所以這應該是什麼查詢在這種情況下,我也不是處理一個字段我正在處理7個字段的表,所以我將不勝感激,如果你相應地更新查詢(至少3個字段)。謝謝 –

0

試試這個。你也想使用PDO或mysqli,因爲mysql_ *很快就會消失...

<?php 
function check_wrong_right($exist) { 
    $lookup = mysql_query("select right from lookup WHERE wrong = '" . mysql_real_escape_string($exist). "'"); 
    if (mysql_num_rows($lookup) == 1) { 
     $row = mysql_fetch_array($lookup); 
     return $row['right']; 
    } 
    return $exist; 
} 

echo check_wrong_right('FSc');