试着写SQL自己加入?

时间:2013-06-14 21:17:57

标签: sql self-join

我有一个与网站相关联的用户表,当客户忘记密码时,他们会创建一个新帐户,而不愿意检索他们忘记的密码。

我希望看到客户通过使用客户电子邮件地址将用户表加入自己加入网站的次数,每次加入时ID都是唯一的,我会在检查中查看是否帐户ID不同。

这是我的问题:

`Select Distinct
T1.Email as "eMail-01", T2.Email as "eMail-02", T1.AccountID as "AccountID-01",     T2.AccountID as "AccountID-02", T1.UserID as "UserID-01", T2.UserID as "UserID-02"

From User T1
Left Join Users T2 on T1.eMail = T2.eMail

Where ( T2.eMail is not null ) and ( T2.eMail <> '' ) 
and ( T1.AccountID <> T2.AccountID )`

该表中有大约60,000条记录,我似乎根据AccountID渗透的数量返回了大量记录。

例如,1个客户使用相同的电子邮件地址注册了5次,因此我收到了25条记录(5 x 5)。我不确定我是否正确地写了这个查询。

查询运行时间很长。

2 个答案:

答案 0 :(得分:1)

如果我理解正确,你最想要的是每个电子邮件地址的AccountID计数,所以这里不需要自我加入。查询将是:

SELECT Email, count(AccountID)
FROM User
GROUP BY Email

并且应该以60.000封电子邮件快速运行。

无论如何,您应该考虑在清理表格后在电子邮件列上放置一个UNIQUE索引。然后,您可以通过电子邮件搜索性能受益,并阻止用户使用相同的电子邮件地址创建多个帐户。这应该有助于他们检索密码。

答案 1 :(得分:1)

建议:

首先,您正在使用一个没用的left join,因为您在关系的右侧过滤了非空的记录(可以用简单的inner join来完成)。您可以使用inner join或删除条件T2.eMail is not null

其次,您的表格是否正确编入索引?如果不是,请添加适当的索引。

第三,您可以使用非常简单的查询来追踪具有多个accountId的电子邮件:

select email, count(accountId) as accounts
from user
group by email
having count(accountId) > 1

然后,您只能使用包含多个帐户的电子邮件。

希望这有帮助