0

更新:私が実際に行っていること:

私はETLツールを作成し、そのスクリプトをphpで記述しています:ETLは特定のドメイン用に設計されており、提供されたデータはその構造と一致していますが、次のように削除する必要があるデータに汚れがありますH.NO , H#, H.NO. should be = HNO:私はのアプローチを使用していますストアドプロシージャ。ここでは、間違った値のルックアップテーブルを作成し、それらを正しい値に置き換えて、最終的に保存されたデータが完全になるようにしました。

dbテーブルで間違った値を検出し、それらを正しいものに置き換える必要があります。


$find[] DBからの値を格納する配列を作成しました。次に、変数があり、それが配列(列)$existに存在するかどうかを確認します。$find[wrong]その場合、その値は対応するcloumn値に置き換えられます$find[right]。このような交換方法を教えてください。ありがとう、

注:私のDBテーブルには、次の名前の2つの列しか含まれていません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

もちろん、mysql_* ではなく PDO と準備済みステートメントを使用するか、変数のエスケープには十分注意してください。

ただし、「間違った」データを移動する必要がある場合:

 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

OK、クエリをこれに変更するだけです

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

一致がない場合、これは 0 行を返します。または、一致する場合は 1 つ (またはテーブルの設定方法に応じて複数の行)。

wrongクエリを最適化するには、フィールドにインデックスが必要です。rightの任意の値に対しての特定の値が 1 つだけ存在する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

これにより、テーブルが新しい値に更新されます。明らかに、テーブルをその場で変更したくない場合は、テーブルのコピーを作成し、そのテーブル コピーに対してこのクエリを実行できます。

于 2012-12-11T20:43:25.130 に答える
0

これを試して。また、mysql_* は間もなくなくなるため、PDO または mysqli を使用することもできます...

<?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 に答える