看起来很简单。我有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 />";
}
这给了我没有错误,但似乎进入了一个无限循环。怎么了?
答案 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? (字符串上的外连接非常慢)。