-1

看起来很简单。我有 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 />";
}

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

4

1 回答 1

1

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

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

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

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

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

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

于 2012-07-17T23:05:18.170 回答