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


209

在[成员]表中,某些行的email列值相同。

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

有些人使用了不同的login_id,但是使用了相同的电子邮件地址,因此在此列上未设置唯一约束。现在,我需要查找这些行,并查看是否应将其删除。

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

Answers:


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)同样有效,并且性能更高。(从堆栈溢出中学到了这个技巧;-)
jpaugh

3
@jpaugh,可能不希望使用count(1) stackoverflow.com/questions/2710621/...
风暴

创建了实质上是无限递归的东西,或者在mysql上由于“连接过多”而导致数据库死了的东西:-/
huygir



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(email)始终为1,因此您的查询将不返回任何内容。
jutky

不,查询实际上为我提供了我需要的数据,这显然是拥有相同电子邮件的人的电子邮件和login_name
Libertine

如果按电子邮件 login_id 分组,则将对同一电子邮件和登录名的行数进行计数,并且这些行在示例中是不同的,因此计数始终为1。这是您的查询的小提琴,返回0行:sqlfiddle。 com /#!9 / 4bbcaf / 3
有趣的

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.