0

我有一个与网站相关联的用户表,当客户忘记密码时,他们会创建一个新帐户,而不是为找回忘记的密码而烦恼。

我想看看有多少次客户通过使用客户电子邮件地址将用户表加入到自身中来加入网站,并且每次加入时 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)。我不确定我是否正确编写了此查询。

查询运行时间很长。

4

2 回答 2

1

如果我理解正确,您最可能想要的是每个电子邮件地址的 AccountID 计数,因此此处无需自行加入。查询将是:

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

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

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

于 2013-06-14T21:41:04.220 回答
1

建议:

首先,您使用的left join是无用的 a,因为您过滤了关系右侧不为空的记录(可以使用简单的 来完成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

然后,您可以只使用拥有多个帐户的电子邮件。

希望这可以帮助

于 2013-06-14T21:43:17.020 回答