0

更新:我实际上在做什么:

我正在制作一个 ETL 工具并在 php 中编写它的脚本:ETL 是为特定域设计的,提供的数据与其结构一致,但数据中有一些脏东西需要删除,例如H.NO , H#, H.NO. should be = HNO:我正在使用的方法存储过程。在其中我为错误值创建了一个查找表并用正确的值替换它们,因此最终存储的数据应该是完美的。

我必须检测 db 表中的错误值并将它们替换为正确的值。


我创建了一个$find[] 存储来自 DB 的值的数组,然后有一个变量$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 )

代码:

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

3 回答 3

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);
于 2012-12-11T20:42:03.813 回答
1

好的,您只需将查询更改为此

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

如果没有匹配,这将返回 0 行。或者如果有匹配项,则为一(或多行,具体取决于表的设置方式)。

你应该在你的wrong字段上有一个索引来优化查询。right如果对于任何值应该只有一个特定值wrong(即wrong在每一行上是唯一的),那么创建wrong一个唯一索引来强制它的唯一性。


更新答案以匹配您修改后的问题。我要做的只是使用 SQL 查询来更新映射表中的错误数据。

所以我假设你的数据库结构可能看起来像这样:

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

这会将现有的表更新为新值。显然,如果您不想就地更改表,您可以制作表的副本,然后针对该表副本运行此查询。

于 2012-12-11T20:43:25.130 回答
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');
于 2012-12-11T20:47:17.133 回答