更新: 我在做什么:
我正在创建一个ETL工具并在php中编写它的脚本:
ETL是针对特定域设计的,提供的数据与其结构一致,但数据中存在一些需要删除的肮脏,如H.NO , H#, H.NO. should be = HNO
:
我正在使用存储过程的方法。其中我为错误的值创建了一个查找表,并用正确的值替换它们,以便最终存储的数据应该是完美的。
我必须在db表中检测错误的值,并用正确的值替换它们。
我创建了一个存储来自DB的值的数组$find[]
,然后有一个变量$exist
,我想检查它是否存在于$find[wrong]
数组中(列) 或不。如果确实如此,那么它的值将替换为相应的cloumn值$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);
答案 0 :(得分:1)
解决MySQL本身问题。撤退时:
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);
答案 1 :(得分:1)
好的,您只需将查询更改为此
即可"SELECT right FROM lookup WHERE wrong = '" . $exists . "'"
如果没有匹配,则返回0行。如果匹配,则为一个(或多个行,具体取决于表的设置方式)。
您的wrong
字段应该有一个索引来优化查询。如果right
的任何值只应有wrong
的一个特定值(即wrong
在每一行上都是唯一的),那么请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
这会将表更新为新值。显然,如果您不想更改表,则可以复制表,然后针对该表副本运行此查询。
答案 2 :(得分: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');