2012-07-17 100 views
0

似乎很简单。我有2个表:MBR和MBR_new。我需要在MBR_new中找到MBR中没有匹配电子邮件记录的每条记录。PHP MySQL找到不匹配的记录

$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

可能不是一个无限循环,但两个嵌入式表扫描,因为你没有索引的你MBR_new表连接列email。 您是否尝试过使用很少测试条目的表进行查询?

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

另外,不要你有MBR_new具有相同的电子邮件地址多次电子邮件(这可能会导致联接爆炸

也谨防表B的email列的数据类型的:它是在您的安装中可索引(取决于您的表格存储格式:是否为具有可合理限制的VARCHAR(n)?是否与表a中的类型相同?)

您希望看到相同的EMAIL有多少次如果只是一次,那么将“DISTINCT”添加到您的选择中,这样查询优化器将立即知道它可以跳到表a中的下一个不同的电子邮件,并忽略它一旦它找到了匹配,就对表b进行扫描。

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

+1

正确。为MBR_new中的电子邮件列索引做了诀窍,另外我还有4个重复的条目。 – MrUpsidown 2012-07-17 23:13:31