查找MySQL中列上具有相同值的行

bob*_*obo 190 mysql sql database

在[member]表中,某些行具有相同的email列值.

login_id | email
---------|---------------------
john     | john123@hotmail.com
peter    | peter456@gmail.com
johnny   | john123@hotmail.com
...
Run Code Online (Sandbox Code Playgroud)

有些人使用不同的login_id但是使用相同的电子邮件地址,此列上没有设置唯一约束.现在我需要找到这些行,看看是否应该删除它们.

我应该使用什么SQL语句来查找这些行?(MySQL 5)

Sco*_*ers 314

此查询将为您提供电子邮件地址列表及其使用次数,首先使用最常用的地址.

SELECT email,
       count(*) AS c
FROM TABLE
GROUP BY email
HAVING c > 1
ORDER BY c DESC
Run Code Online (Sandbox Code Playgroud)

如果你想要完整的行:

select * from table where email in (
    select email from table
    group by email having count(*) > 1
)
Run Code Online (Sandbox Code Playgroud)

  • `count(1)` 效果同样好,而且性能更高。(从[so]那里学到了这个技巧;-) (3认同)
  • @jpaugh,可能不想使用`count(1)`/sf/ask/189743501/ (2认同)

HLG*_*GEM 56

select email from mytable group by email having count(*) >1
Run Code Online (Sandbox Code Playgroud)

  • 接受的答案不适用于Postgres,这个答案也适用. (7认同)

Iva*_*uev 12

这是查询email用于多于一个的查询login_id:

SELECT email
FROM table
GROUP BY email
HAVING count(*) > 1
Run Code Online (Sandbox Code Playgroud)

您将需要第二个(嵌套的)查询来获取login_idby的列表email.


Ser*_*nin 9

接受的答案的第一部分不适用于MSSQL.
这对我有用:

select email, COUNT(*) as C from table 
group by email having COUNT(*) >1 order by C desc
Run Code Online (Sandbox Code Playgroud)


小智 5

如果您的电子邮件列包含空值,请使用此选项

 select * from table where email in (
    select email from table group by email having count(*) > 1 and email != ''
    )
Run Code Online (Sandbox Code Playgroud)