Temukan baris yang memiliki nilai yang sama pada kolom di MySQL

209

Dalam tabel [anggota], beberapa baris memiliki nilai yang sama untuk emailkolom.

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

Beberapa orang menggunakan login_id berbeda tetapi alamat email yang sama, tidak ada kendala unik yang ditetapkan pada kolom ini. Sekarang saya perlu mencari baris ini dan melihat apakah mereka harus dihapus.

Pernyataan SQL apa yang harus saya gunakan untuk menemukan baris ini? (MySQL 5)

bobo
sumber

Jawaban:

341

Kueri ini akan memberi Anda daftar alamat email dan berapa kali mereka digunakan, dengan alamat yang paling sering digunakan terlebih dahulu.

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

Jika Anda ingin baris penuh:

select * from table where email in (
    select email from table
    group by email having count(*) > 1
)
Scott Saunders
sumber
1
count(1)bekerja sama baiknya, dan lebih performan. (Pelajari trik itu dari Stack Overflow ;-)
jpaugh
3
@ jpaugh, mungkin tidak ingin menggunakan count(1) stackoverflow.com/questions/2710621/…
Storm
menciptakan apa yang pada dasarnya rekursi tak terbatas atau sesuatu di mysql mengakibatkan database mati karena "terlalu banyak koneksi": - /
huygir
56
select email from mytable group by email having count(*) >1
HLGEM
sumber
7
Jawaban yang diterima tidak bekerja dengan Postgres, yang ini tidak.
azio
@HLGEM: stackoverflow.com/questions/41359879/...
Syed Asad Abbas Zaidi
13

Berikut ini permintaan untuk menemukan emailyang digunakan untuk lebih dari satu login_id:

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

Anda harus kedua (dari bersarang) query untuk mendapatkan daftar login_idoleh email.

Ivan Nevostruev
sumber
10

Bagian pertama dari jawaban yang diterima tidak berfungsi untuk MSSQL.
Ini bekerja untuk saya:

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

gunakan ini jika kolom email Anda mengandung nilai kosong

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

Saya tahu ini adalah pertanyaan yang sangat lama tetapi ini lebih untuk orang lain yang mungkin memiliki masalah yang sama dan saya pikir ini lebih akurat untuk apa yang diinginkan.

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

Ini akan mengembalikan semua catatan yang memiliki [email protected] sebagai nilai login_id.

Marc L.
sumber
2

Terima kasih teman-teman :-) Saya menggunakan di bawah ini karena saya hanya peduli pada dua kolom dan tidak begitu banyak tentang sisanya. Bekerja dengan baik

  select email, login_id from table
    group by email, login_id
    having COUNT(email) > 1
Jangak
sumber
2
Dalam kasus yang dimaksud, COUNT (email) akan selalu 1, jadi permintaan Anda tidak akan menghasilkan apa-apa.
Juli
Tidak, permintaan itu benar-benar memberi saya data yang saya butuhkan, yang jelas merupakan email dan nama login dari mereka yang memiliki email yang sama
Libertine
Jika Anda mengelompokkan berdasarkan email dan login_id, Anda akan menghitung jumlah baris untuk email dan login yang sama, dan mereka berbeda dalam contoh Anda, jadi hitung akan selalu menjadi 1. Inilah biola dengan kueri Anda yang menghasilkan 0 baris: sqlfiddle. com / #! 9 / 4bbcaf / 3
jutky
1

Dapatkan seluruh catatan seperti yang Anda inginkan menggunakan kondisi dengan kueri pemilihan internal.

SELECT *
FROM   member
WHERE  email IN (SELECT email
                 FROM   member
                 WHERE  login_id = abcd.user@hotmail.com) 
Suba Karthikeyan
sumber