0

CSV をアップロードし、データベースの重複チェッカー一時テーブルに挿入するスクリプトがあります。その時点で、次のことを行います。

1) 自身 (一時テーブル) の重複をチェックし、それらをすべて一時テーブルから削除します 2) 顧客テーブルの重複をチェックし、それらを一時テーブルから削除します

現在、顧客テーブルには数十万のレコードがあるため、すべてを粉砕停止に引きずっているように見えるphpループでこれを行っています。代わりに、これを多くクエリに入れることができれば、物事がうまくいくと思います。アップロードは正常に機能します。問題のコードのセクションは次のとおりです。

<?
// look for duplicate account_no in the temp table
$sql_1 = "SELECT account_no,count(*) FROM tempTable GROUP BY account_no";
$result_1 = mysql_query($sql_1) or die("Error: " . mysql_error() . "<br>");
while(list($acct,$numcount) = mysql_fetch_row($result_1)) {
// if there is a duplicate in tempTable, delete them all
 if($numcount>1) {
   $toBeRemoved+=$numcount;
   $sql_delete = "DELETE FROM tempTable WHERE(account_no = '$acct')";
   $result_delete = mysql_query($sql_delete) or die("Error: " . mysql_error() . "<br>");
 }
}

// look for duplicate account_no in the customersTable and delete from tempTable
$sql_2 = "SELECT account_no FROM customersTable";
$result_2 = mysql_query($sql_2) or die("Error: " . mysql_error() . "<br>");
while(list($acct) = mysql_fetch_row($result_2)) {
   $sql_delete = "DELETE FROM tempTable WHERE(account_no = '$acct')";
   $result_delete = mysql_query($sql_delete) or die("Error: " . mysql_error() . "<br>");
}
?>
4

3 に答える 3

1

最初のテーブルには、一意の ID を持つ列が必要です。

DELETE FROM tempTable
USING tempTable, tempTable t2
WHERE tempTable.account_no = t2.account_no
   AND tempTable.id > t2.id

2 番目のテーブル:

DELETE FROM tempTable WHERE account_no IN (SELECT account_no FROM customersTable)

インデックスが存在し、使用されていることを確認することもできます。

于 2012-06-18T16:06:03.960 に答える
1

データベース テーブルに適切なキーがある場合は、重複キー エラーを無視し、重複していない行の挿入を続行するため、UNIQUE盲目的INSERTに を使用できます。INSERT IGNORE

于 2012-06-18T15:50:18.537 に答える
0

これに対する最終的な解決策は、 にインデックスを作成しaccount_noて使用することでしたJOIN。今ではすべてを数秒で実行します。皆様、ご協力ありがとうございました!

于 2012-06-19T18:26:10.803 に答える