0

以下のクエリで重複するメールを見つけるにはどうすればよいですか?

SELECT b_email AS email FROM user WHERE status = 3 AND b_email != '' 
UNION (SELECT c_email AS email FROM user WHERE status = 3 AND c_email != '') 
UNION (SELECT user_email AS email FROM user WHERE status = 3 AND user_email != '') 
UNION (SELECT user_email AS email FROM sub_user WHERE status = 3 AND user_email != '') 
UNION (SELECT su_email AS email FROM sub_user WHERE status = 3 AND su_email != '') 
ORDER BY email ASC

ありがとう。

4

1 に答える 1

3

UNION重複を削除するため、クエリ結果に重複はありません。重複を保持するには、UNION ALL代わりに次を使用します。

SELECT b_email AS email FROM user WHERE status = 3 AND b_email != ''
UNION ALL SELECT c_email AS email FROM user WHERE status = 3 AND c_email != ''
...

重複しているメールアドレスを特定するには、次のようにします。

  • クエリを変更して、重複を含むすべての電子メール アドレスのリストを返します(これは、UNION ALL代わりに を使用することを意味しますUNION)
  • メールアドレスでカウントする外側のクエリでラップする
  • 外部クエリの結果を、カウントが 2 つ以上の電子メール アドレスに限定する

これを行う方法は次のとおりです(これは、投稿されたクエリが機能することを前提としています):

SELECT email, COUNT(*)
FROM (
  SELECT b_email AS email FROM user WHERE status = 3 AND b_email != '' 
  UNION ALL SELECT c_email AS email FROM user WHERE status = 3 AND c_email != ''
  UNION ALL SELECT user_email AS email FROM user WHERE status = 3 AND user_email != ''
  UNION ALL SELECT user_email AS email FROM sub_user WHERE status = 3 AND user_email != ''
  UNION ALL SELECT su_email AS email FROM sub_user WHERE status = 3 AND su_email != ''
) EmailGlom
GROUP BY email
HAVING COUNT(*) > 1

結果は、内部クエリで複数回表示されるすべての電子メール アドレスになります。

于 2013-03-21T03:31:52.377 に答える