web-dev-qa-db-ja.com

MySQLの列で同じ値を持つ行を見つける

[member]テーブルでは、いくつかの行がemail列に対して同じ値を持ちます。

login_id | email
---------|---------------------
john     | [email protected]
peter    | [email protected]
johnny   | [email protected]
...

異なるlogin_idを使用しているが同じEメールアドレスを使用している人もいます。この列には一意の制約が設定されていません。今、私はこれらの行を見つけ、それらを削除する必要があるかどうかを確認する必要があります。

これらの行を見つけるためにどのSQLステートメントを使用すればよいですか? (MySQL 5)

173
bobo

このクエリはあなたに電子メールアドレスのリストとそれらが使われた回数をあなたに与えるでしょう。

SELECT email,
       count(*) AS c
FROM TABLE
GROUP BY email
HAVING c > 1
ORDER BY c DESC

全行が必要な場合:

select * from table where email in (
    select email from table
    group by email having count(*) > 1
)
288
Scott Saunders
select email from mytable group by email having count(*) >1
53
HLGEM

これは、複数のlogin_idで使用されているemailを見つけるためのクエリです。

SELECT email
FROM table
GROUP BY email
HAVING count(*) > 1

emaillogin_idのリストを取得するには、2番目の(ネストした)クエリが必要です。

12
Ivan Nevostruev

受け入れられた回答の最初の部分は、MSSQLでは機能しません。
これは私にとって役に立ちました:

select email, COUNT(*) as C from table 
group by email having COUNT(*) >1 order by C desc
9
Sergey Makhonin

email列に空の値が含まれている場合はこれを使用してください

 select * from table where email in (
    select email from table group by email having count(*) > 1 and email != ''
    )
4
ramesh kumar

私はこれが非常に古い質問であることを知っています、しかしこれは同じ問題を抱えているかもしれない他の誰かのためにより多くであり、そして私はこれが望まれたものにもっと正確であると思います。

SELECT * FROM member WHERE email = (Select email From member Where login_id = [email protected]) 

これは、login_id値として[email protected]を持つすべてのレコードを返します。

2
Marc L

みんなありがとう:-)私はこれらの2つのコラムだけを気にし、残りの部分についてはそれほど気にしなかったので、私は以下を使いました。うまくいった

  select email, login_id from table
    group by email, login_id
    having COUNT(email) > 1
1
Libertine

内部選択クエリで条件を使用して、必要に応じてレコード全体を取得します。

SELECT *
FROM   member
WHERE  email IN (SELECT email
                 FROM   member
                 WHERE  login_id = [email protected]) 
0