Php 如果在数组中,则替换为相应的列
更新: 我实际上在做什么: 我正在制作一个ETL工具,并用php编写其脚本: ETL是为特定领域而设计的,提供的数据与其结构一致,但数据中存在一些污点,需要删除,如Php 如果在数组中,则替换为相应的列,php,Php,更新: 我实际上在做什么: 我正在制作一个ETL工具,并用php编写其脚本: ETL是为特定领域而设计的,提供的数据与其结构一致,但数据中存在一些污点,需要删除,如H.NO,H#,H.NO。应为=HNO: 我正在使用存储过程的方法。在其中,我为错误的值创建了一个查找表,并用正确的值替换它们,以便最终存储的数据应该是完美的 我必须检测db表中的错误值,并用正确的值替换它们,仅此而已 我已经创建了一个数组$find[],它存储来自DB的值,然后有一个变量$exist,我想检查它是否存在于$find
H.NO,H#,H.NO。应为=HNO
:
我正在使用存储过程的方法。在其中,我为错误的值创建了一个查找表,并用正确的值替换它们,以便最终存储的数据应该是完美的
我必须检测db表中的错误值,并用正确的值替换它们,仅此而已
我已经创建了一个数组
$find[]
,它存储来自DB的值,然后有一个变量$exist
,我想检查它是否存在于$find[error]
数组(列)中。如果它这样做,那么它的值将被替换为相应的cloumn值$find[right]
。请让我知道我如何能做这样的替换。谢谢
注意:My DB表只包含两列,分别命名为Error和right
当我转储$find
数组时,它给了我以下输出:
Array([0]=>Array([0]=>FSc[错误]=>FSc[1]=>FSc[正确]=>FSc)[1]=>Array([0]=>FSc[错误]=>FSc[1]=>FSc[正确]=>FSc)
代码:
在MySQL中自行求解。检索时:
SELECT right, IF(wrong='$exist',right,wrong) as wrong from lookup
当然,使用PDO&prepared语句而不是mysql_173,或者在转义变量时要非常小心
但是,如果需要删除“错误”数据:
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);
好的,您只需将查询更改为
"SELECT right FROM lookup WHERE wrong = '" . $exists . "'"
如果不存在匹配项,则返回0行。如果存在匹配项,则返回一行(或多行,具体取决于表的设置方式)
您应该在错误
字段上有一个索引来优化查询。如果错误
的任何值都应该只有一个特定的正确
(即错误
在每一行上都是唯一的),则将错误
作为唯一索引来强制执行其唯一性
更新的答案与修改后的问题相匹配。我只需使用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
这会将表就地更新为新值。显然,如果不想就地更改表,可以创建表的副本,然后对该表副本运行此查询。试试这个。您还需要使用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');
你到底想做什么?解决这个问题肯定有对的
和错的
方法,我担心你选择了错的
方法。你只是想得到数据库中存在的对的
的值,该值在错的
中等于$exists
?@MikeBrant是的,你是对的,事实上我正在执行数据清理,所以我创建了一个查找表。我还想替换其他各种字段,所以我想如果我将它们存储到数组中,然后进行检查,这样我就可以更快地得到结果,因为我正在处理来自数据库的约50K行,需要清理脏数据a请让我知道在您看来,我这样做是正确的还是应该使用其他一些技巧,目前我正在做的是上传一个文件并将其转储到我的数据库,然后从数据库中获取值并对其执行清理…如果这是一次性数据迁移,那么这肯定是错误的方法。您可能会被拒绝即使涉及到PHP,你也可以做任何你需要做的事情。如果你能澄清你在问题中想做什么,那么我肯定会提供帮助。@softgenic看一看修改后的答案。请看一看,你可以测试,我测试了查询,但H。不
不会重演,所以这项技术将在O(1)中运行?因为我处理的是~50K行,我必须一次又一次地查找..如果您需要永久更新它们…只需在cron下运行更新查询(我将在中添加答案),应该足够快。如果“错误”数据不断出现,MYSQL本身中的BEFORE INSERT/BEFORE UPDATE触发器可能是正确的,完全不需要“定期”修复。+1,您的更新非常好,实际上在H.No.address…
等字段中有一些字符串,因此我必须从这些字符串中替换H.No.部分对于HNO ONLY
,在这种情况下,查询应该是什么,我也不是在处理一个字段,而是在处理表中的7个字段,因此如果您相应地更新查询(至少3个字段),我将不胜感激。谢谢你能给我们一个类似的,因此,在你的错误的列中会有'H.No.%
,而ON
子句将是关于数据的来修复一些类似查找的字段。错误的。对于每个字段,你都需要在查找表上进行单独的连接,所以使用别名。或者你当然可以运行7个单独的查询。我已经修改了这个例子有两列而不是三列,因为我不喜欢别人告诉我在帮助别人的时候该做什么,但是我会找到足够多的同情来提供答案,而不是停在那里。
<?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');