ค้นหาแถวที่มีค่าเท่ากันในคอลัมน์ใน MySQL


209

ในตาราง [สมาชิก] บางแถวมีค่าเดียวกันสำหรับemailคอลัมน์

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

บางคนใช้ login_id ที่แตกต่างกัน แต่ที่อยู่อีเมลเดียวกันไม่มีข้อ จำกัด ที่ไม่ซ้ำกันในคอลัมน์นี้ ตอนนี้ฉันต้องการค้นหาแถวเหล่านี้และดูว่าควรลบออกไหม

คำสั่ง SQL ใดที่ฉันควรใช้เพื่อค้นหาแถวเหล่านี้ (MySQL 5)

คำตอบ:


341

ข้อความค้นหานี้จะให้รายการที่อยู่อีเมลแก่คุณและมีการใช้งานกี่ครั้งด้วยที่อยู่ที่ใช้บ่อยที่สุดก่อน

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
)

1
count(1)ทำงานได้ดีเท่าเทียมกันและมีประสิทธิภาพมากขึ้น (เรียนรู้เคล็ดลับจากStack Overflow ;-)
jpaugh

3
@jpaugh อาจไม่ต้องการใช้count(1) stackoverflow.com/questions/2710621/
Storm

สร้างสิ่งที่เรียกซ้ำไม่มีที่สิ้นสุดเป็นหลักหรือบางสิ่งบางอย่างใน mysql ทำให้ฐานข้อมูลที่ตายแล้วเนื่องจาก "การเชื่อมต่อมากเกินไป": - /
huygir


13

นี่คือแบบสอบถามเพื่อค้นหาemailของที่ใช้สำหรับมากกว่าหนึ่งlogin_id:

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

คุณจะต้องสอง (จากที่ซ้อนกัน) แบบสอบถามเพื่อรับรายชื่อของโดยlogin_idemail


10

ส่วนแรกของคำตอบที่ยอมรับไม่ทำงานสำหรับ MSSQL
สิ่งนี้ใช้ได้กับฉัน:

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

5

ใช้สิ่งนี้หากคอลัมน์อีเมลของคุณมีค่าว่าง

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

3

ฉันรู้ว่านี่เป็นคำถามที่เก่ามาก แต่ก็มีมากขึ้นสำหรับคนอื่นที่อาจมีปัญหาเดียวกันและฉันคิดว่านี่เป็นสิ่งที่ถูกต้องมากกว่าสำหรับสิ่งที่ต้องการ

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

นี่จะส่งคืนระเบียนทั้งหมดที่มี john123@hotmail.com เป็นค่า login_id


2

ขอบคุณพวก :-) ฉันใช้ด้านล่างเพราะฉันใส่ใจแค่สองคอลัมน์เท่านั้นและไม่เหลืออะไรมาก ใช้งานได้ดีมาก

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

2
ในกรณีที่เป็นปัญหา COUNT (อีเมล) จะเป็น 1 เสมอดังนั้นคุณจะไม่ส่งคืนข้อความค้นหาใด ๆ
jutky

ไม่แบบสอบถามให้ข้อมูลที่ฉันต้องการซึ่งเป็นอีเมลและ login_name ของผู้ที่มีอีเมลเดียวกันอย่างชัดเจน
Libertine

หากคุณจัดกลุ่มทางอีเมลและ login_id คุณจะนับจำนวนแถวสำหรับอีเมลและเข้าสู่ระบบเดียวกันและจำนวนนั้นแตกต่างกันในตัวอย่างของคุณดังนั้นการนับจะเป็น 1 เสมอนี่คือซอที่มีคิวรี
jutky

1

รับระเบียนทั้งหมดตามที่คุณต้องการโดยใช้เงื่อนไขกับแบบสอบถามแบบใช้เลือกข้อมูล

SELECT *
FROM   member
WHERE  email IN (SELECT email
                 FROM   member
                 WHERE  login_id = abcd.user@hotmail.com) 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.