【问题标题】:Find rows that have the same value on a column in MySQL在 MySQL 中的列上查找具有相同值的行
【发布时间】:2010-12-19 16:22:06
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: sql mysql database


    【解决方案1】:

    这个帖子很晚了,但我遇到了类似的情况,以下是在 MySQL 上工作的。以下查询还将返回所有符合重复电子邮件条件的行

    SELECT * FROM TABLE WHERE EMAIL IN 
           (SELECT * FROM 
                (SELECT EMAIL FROM TABLE GROUP BY EMAIL HAVING COUNT(EMAIL) > 1) 
            AS X);
    

    【讨论】:

      【解决方案2】:

      这个效果最好

      截图

      SELECT RollId, count(*) AS c 
          FROM `tblstudents` 
          GROUP BY RollId 
          HAVING c > 1 
          ORDER BY c DESC
      

      【讨论】:

        【解决方案3】:

        使用带有内部选择查询的条件,根据需要获取整个记录。

        SELECT *
        FROM   member
        WHERE  email IN (SELECT email
                         FROM   member
                         WHERE  login_id = abcd.user@hotmail.com) 
        

        【讨论】:

          【解决方案4】:

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

          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
          )
          

          【讨论】:

          • count(1) 工作得同样好,而且性能更高。 (从Stack Overflow 学到了这个技巧 ;-)
          • @jpaugh,可能不想使用count(1)stackoverflow.com/questions/2710621/…
          • 在 mysql 上创建了本质上是无限递归的东西,由于“连接太多”而导致数据库死机:-/
          • 也适用于 SQLite。谢谢!
          【解决方案5】:

          我知道这是一个非常古老的问题,但这更适用于可能有同样问题的其他人,我认为这更准确地满足了我们的需求。

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

          这将返回所有以 john123@hotmail.com 作为 login_id 值的记录。

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

              【解决方案7】:

              谢谢大家 :-) 我使用下面的内容是因为我只关心这两列,而不太关心其余的列。效果很好

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

              【讨论】:

              • 在有问题的情况下,COUNT(email) 将始终为 1,因此您的查询将不会返回任何内容。
              • 不,查询实际上给了我我需要的数据,这显然是拥有相同电子邮件的人的电子邮件和登录名
              • 如果您按电子邮件分组和 login_id,您将计算同一电子邮件和登录名的行数,并且在您的示例中这些是不同的,因此计数将始终为 1 . 这是返回 0 行的查询的小提琴:sqlfiddle.com/#!9/4bbcaf/3
              【解决方案8】:

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

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

              【讨论】:

                【解决方案9】:

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

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

                您需要第二个(嵌套的)查询来获取email 的login_id 列表。

                【讨论】:

                  【解决方案10】:
                  select email from mytable group by email having count(*) >1
                  

                  【讨论】:

                  猜你喜欢
                  • 2012-06-18
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-01-27
                  • 1970-01-01
                  • 2011-06-23
                  • 2018-11-15
                  • 1970-01-01
                  • 2021-08-02
                  相关资源
                  最近更新 更多