MySQL'de bir sütunda aynı değere sahip satırları bulma


209

[Üye] tablosunda, bazı satırlar emailsütun için aynı değere sahiptir .

login_id | email
---------|---------------------
john     | john123@hotmail.com
peter    | peter456@gmail.com
johnny   | john123@hotmail.com
...

Bazı kişiler farklı bir login_id kullandılar ancak aynı e-posta adresini kullandılar, bu sütunda benzersiz bir kısıtlama belirlenmedi. Şimdi bu satırları bulmam ve kaldırılmaları gerekip gerekmediğini görmem gerekiyor.

Bu satırları bulmak için hangi SQL ifadesini kullanmalıyım? (MySQL 5)

Yanıtlar:


341

Bu sorgu size en çok kullanılan adresler ilk önce olacak şekilde bir e-posta adresi listesi ve kaç kez kullanıldıklarını verecektir.

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

Tam satırları istiyorsanız:

select * from table where email in (
    select email from table
    group by email having count(*) > 1
)

1
count(1)eşit derecede iyi çalışır ve daha performanslıdır. ( Stack Overflow'dan bu numarayı öğrendim ;-)
jpaugh


aslında çok fazla bağlantı nedeniyle ölü bir veritabanı ile sonuçlanan mysql üzerinde sonsuz özyineleme ya da bir şey neydi yarattı: - /
huygir


13

İşte emailbirden fazla için kullanılan bulmak için sorgu login_id:

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

login_idTarafından listesini almak için ikinci (iç içe) sorguya ihtiyacınız olacaktır email.


10

Kabul edilen cevabın ilk kısmı MSSQL için çalışmaz.
Bu benim için çalıştı:

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

5

e-posta sütununuzda boş değerler varsa bunu kullanın

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

3

Bunun çok eski bir soru olduğunu biliyorum ama bu aynı sorunu yaşayan başka biri için daha fazla ve bence bu istenen şey için daha doğru.

SELECT * FROM member WHERE email = (Select email From member Where login_id = john123@hotmail.com) 

Bu, john123@hotmail.com adresine sahip tüm kayıtları bir login_id değeri olarak döndürür.


2

Teşekkürler :-) Ben aşağıda kullandım çünkü sadece bu iki sütun hakkında bakım ve geri kalanı hakkında çok fazla değil. Harika çalıştı

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

2
Söz konusu durumda, COUNT (e-posta) her zaman 1 olur, bu nedenle sorgu hiçbir şey döndürmez.
jutky

Hayır, sorgu aslında bana ihtiyacım olan verileri verdi, bu da aynı e-postaya sahip olanların e-postası ve oturum açma_adı
Libertine

E-posta ve login_id'e göre gruplandırırsanız , aynı e-posta ve giriş için satır sayısını sayarsınız ve bunlar örneğinizde farklıdır, bu nedenle sayı her zaman 1 olur. İşte sorgunuzda 0 satır döndüren keman: sqlfiddle. com / #! 9 / 4bbcaf / 3
jutky

1

İç seçme sorgusuyla koşulu kullanarak tüm kaydı istediğiniz gibi alın.

SELECT *
FROM   member
WHERE  email IN (SELECT email
                 FROM   member
                 WHERE  login_id = abcd.user@hotmail.com) 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.