【问题标题】:Get all users with duplicate email addresses获取所有具有重复电子邮件地址的用户
【发布时间】:2013-09-18 14:26:03
【问题描述】:

我正在编写一个 MySQL 查询,我可以从用户表中获取所有具有重复电子邮件地址的记录。

这是我目前的查询.. 我的 PHPMyAdmin 一直在加载:

select personal_email, userid
from user
where personal_email in (
select personal_email
from user
group by personal_email
having count(personal_email) > 1);

如果我使用下面的查询,我只会收到一次所有双重电子邮件:

select personal_email, count(personal_email)
from user
group by personal_email
having count(personal_email) > 1

目标是获取所有包含重复电子邮件的记录。

【问题讨论】:

  • 您的第一个查询应该可以工作。它可能很慢的原因是personal_email 上没有索引。
  • personal_email 是索引字段吗?

标签: mysql sql


【解决方案1】:

尝试使用 JOIN 而不是 IN 进行查询:

SELECT  user.personal_email, user.userid
FROM    user 
        INNER JOIN
        (   SELECT  personal_email
            FROM    User
            GROUP BY personal_email
            HAVING COUNT(*) > 1
        ) dupe
            ON dupe.personal_email = user.personal_email;

MySQL 通常会更好地优化 INNER JOIN。

【讨论】:

  • 谢谢!!这完成了工作:)
【解决方案2】:

也许在 MySQL 中最有效的方法是使用exists 子句:

select u.*
from user u
where exists (select 1
              from user u2
              where u.personal_email = u2.personal_email and
                    u.userid <> u2.userid
             );

为获得最佳性能,请在 user(personal_email, userid) 上创建索引。

【讨论】:

    【解决方案3】:

    您可以将该结果用作您的选择标准

    select * from user where personal_email IN (
    
       select personal_email
       from user
       group by personal_email
       having count(personal_email) > 1 );
    

    sqlfiddle for you

    【讨论】:

      【解决方案4】:

      您可以通过电子邮件将表格加入到自身中:

      select distinct u1.personal_email, u1.userid
      from user u1
      join user u2 on u2.personal_email = u2.personal_email
          and u2.userid != u1,userid
      

      这项工作的关键是将u2.userid != u1,userid 添加到连接条件中,以防止行连接到自身。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-19
        • 1970-01-01
        • 1970-01-01
        • 2022-10-01
        • 2012-07-05
        • 1970-01-01
        • 2015-11-19
        相关资源
        最近更新 更多