【问题标题】:SQL Query with COUNT, Having Count >1, display full details of duplicates带有 COUNT 的 SQL 查询,具有 Count >1,显示重复项的完整详细信息
【发布时间】:2019-08-21 14:49:00
【问题描述】:

我有一张这样的桌子:

name  employment_Status  email
----     ----             -----
David     E              David@email.com
John      U              John@email.com
Michael   E              Michael@email.com
Steve     E              Michael@email.com
James     U              David@email.com
Mary      U              Mary@email.com
Beth      E              Beth@email.com

我首先选择了emailcount(email)

SELECT email, COUNT(email) AS emailCount
FROM Table
GROUP BY email
HAVING ( COUNT(email) > 1 );

当我尝试包含name 时出现问题:

SELECT name, email, COUNT(email) AS emailCount
FROM Table
GROUP BY name, email
HAVING ( COUNT(email) > 1 );

我想查找所有电子邮件地址重复的人,(仅在两个人都受雇的情况下 (E))。但是它返回的结果为零。

我希望能够为具有重复电子邮件且拥有employment_Status E 的人显示所有信息。如果两个人有相同的电子邮件,但其中一个或两个都是失业者 (U),则忽略。

谁能给点建议?

【问题讨论】:

    标签: mysql sql join count having


    【解决方案1】:

    我想你想要exists:

    select t.*
    from t
    where t.employeed = 'E' and
         exists (select 1
                 from t t2
                 where t2.email = t.email and t2.employeed = 'E' and
                       t2.name <> t.name
                );
    

    请注意,这假定name(或至少name/email)是唯一的。

    在 MySQL 8+ 中,您可以使用窗口函数:

    select t.*
    from (select t.*, count(*) over (partition by t.email) as cnt
          from t
          where t.employeed = 'E'
         ) t
    where cnt >= 2;
    

    【讨论】:

      【解决方案2】:

      一种方法是将您的查询用作 FROM 子句中的子查询,并将结果与​​主表连接。

      SELECT t.*, d.emailCount
      FROM (
          SELECT email, employment_Status, COUNT(*) AS emailCount
          FROM my_table
          GROUP BY email
          WHERE employment_Status = 'E'
          HAVING emailCount > 1 
      ) d
      JOIN my_table t USING(email, employment_Status)
      

      您也可以使用GROUP_CONCAT(name),如果您可以在(逗号)分隔的字符串中获取名称:

      SELECT email, COUNT(*) AS emailCount, GROUP_CONCAT(name) as names
      FROM my_table
      GROUP BY email
      WHERE employment_Status = 'E'
      HAVING emailCount > 1 
      

      您的样本数据的结果是:

      email               emailCount    names
      -----------------------------------------------
      Michael@email.com       2         Michael,Steve
      

      【讨论】:

      • 谢谢大家的建议。他们都非常有帮助。
      猜你喜欢
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-03
      • 2015-02-22
      • 1970-01-01
      • 2020-06-28
      • 2022-10-19
      相关资源
      最近更新 更多