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)

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
)

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


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.


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

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 != ''
    )

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 john123@hotmail.com sebagai nilai login_id.


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

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) 
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.