PHP MySQL找到不匹配的记录

时间:2012-07-17 22:53:21

标签: php mysql

看起来很简单。我有2个表:MBR和MBR_new。我需要在MBR中找到MBR_new中没有匹配电子邮件记录的每条记录。

$result = $db->query("
SELECT a.NICK
FROM MBR as a
LEFT JOIN   
MBR_new as b
ON b.email = a.EMAIL
WHERE b.email IS NULL;
");

while ($obj = $result->fetch_object()) {

    echo "No e-mail found for user $obj->NICK<br />";
}

这给了我没有错误,但似乎进入了一个无限循环。怎么了?

1 个答案:

答案 0 :(得分:0)

可能不是无限循环而是两次嵌入式表扫描,因为您没有在MBR_new表中索引连接列email。 您是否尝试过只有很少测试条目的表格?

如果您没有此类索引,则使用NOT IN(subquery)将仅为MBR_new表中的现有电子邮件创建临时且紧凑的唯一索引。

此外,您是否在MBR_new中拥有多次具有SAME电子邮件地址的电子邮件(这可能会导致联接爆炸。

还要注意表b的email列的数据类型:它在您的安装中是否可索引(取决于您的表存储格式:它是一个具有可合理限制的VARCHAR(n)吗?它是否是相同的类型如表a?)

您希望在结果集中看到相同的EMAIL地址多少次?如果它只是一次,那么将“DISTINCT”添加到您的selct,以便查询优化器立即知道它可以跳到表a中的下一个不同的电子邮件,并在找到匹配后忽略对表b的进一步扫描

还要注意:表A和B中是否有空邮件条目?首先生成包含与唯一ID相关联的电子邮件地址的表是不安全的,然后仅在表A和B中使用此ID? (字符串上的外连接非常慢)。