0

顧客がパスワードを忘れたときに、忘れたパスワードを取得するのではなく、新しいアカウントを作成する Web サイトに関連付けられたユーザーテーブルがあります。

顧客の電子メールアドレスを使用してユーザーテーブルをそれ自体に結合することにより、顧客が Web サイトに参加した回数を確認したいと思います。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 に答える