mysql查询帮助-需要在重复检查脚本上卸载PHP

mysql查询帮助-需要在重复检查脚本上卸载PHP,php,mysql,Php,Mysql,我有一个脚本,可以上传CSV并将其插入到数据库中的一个重复的checker临时表中。此时,它会执行以下操作: 1) 检查自身(临时表)是否存在重复项,并将其全部从临时表中删除 2) 检查客户表是否存在重复项,并将其从临时表中删除 现在我正在用php循环来做这件事,它似乎把整个事情拖到了一个令人生厌的地步,因为customer表有数十万条记录。我相信,如果我能在一个查询中输入大量信息,可能会使事情变得更好。上传工作正常,下面是有问题的代码部分 <? // look for duplicate

我有一个脚本,可以上传CSV并将其插入到数据库中的一个重复的checker临时表中。此时,它会执行以下操作:

1) 检查自身(临时表)是否存在重复项,并将其全部从临时表中删除 2) 检查客户表是否存在重复项,并将其从临时表中删除

现在我正在用php循环来做这件事,它似乎把整个事情拖到了一个令人生厌的地步,因为customer表有数十万条记录。我相信,如果我能在一个查询中输入大量信息,可能会使事情变得更好。上传工作正常,下面是有问题的代码部分

<?
// 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>");
}
?>

如果数据库表上有正确的
唯一
键,则可以使用
插入忽略
盲目插入
键,因为这将忽略重复的键错误并继续插入不重复的行。

对于第一个表,您将需要一个具有唯一id的列:

DELETE FROM tempTable
USING tempTable, tempTable t2
WHERE tempTable.account_no = t2.account_no
   AND tempTable.id > t2.id
第二表:

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

您可能还需要检查索引是否存在并正在使用。

最终解决方案是在
账号上创建索引,并使用
加入
。现在它能在几秒钟内完成一切。谢谢大家的帮助

这些都是在准备将非DUP插入客户表吗?是的。我也会考虑Kolink的答案,重写你的过程,完全跳过上面的代码,使用插入忽略。它将消除耗时的循环,并通过忽略插入时的重复项来执行相同的过程。无法执行此操作,因为插入发生得较晚,并且由执行插入的客户端用户控制。这并不重要,但通过后台,在上述步骤之后,客户机用户下载一个新的CSV,并在选择将其插入客户表之前对其进行审查。最重要的是,如果可能的话,我需要第二步(检查客户表中的DUPES并从临时表删除)成为一个查询。出于我无法控制的原因,除非您认为ActuixNO是唯一的,否则没有唯一的密钥。此外,它在几步之后才执行插入操作,这是由用户控制的另一个过程。这里最重要的一步是挂起整个内容,这一步是关于检查customer表中的重复项并删除的部分。在查询中有什么方法可以做到这一点吗?谢谢,这看起来是一个更好的解决方案,我实现了它。然而,第二个问题仍然没有解决。你能想出任何可能阻止绞刑的解决办法吗?或者是一种成批执行此操作并显示进度的方法?您也可以尝试以下语法,它通常在大型联接表上运行得更快:使用可诱惑的、CustomerTable ct从可诱惑的位置删除。account\u no=ct.account\n我尝试过它。仍然永远挂着。必须有一种方法来检查30万条记录,而不必进行所有这些斗争。也许是打破它的方法?我不知道。但我知道300k在mysql世界中并不多。您可以尝试在account_no字段的两个表中添加索引,但我认为这不会有多大帮助,因为您的子查询正在查看该表中的每一行。我想在下一个注释中为您的第二个查询尝试类似的查询。使用可诱惑的customersTable t2从可诱惑中删除,其中可诱惑的.account\u no=t2.account\u no