【问题标题】:Specific duplicate selection in MySQLMySQL中特定的重复选择
【发布时间】:2012-02-21 23:46:51
【问题描述】:

我确实查看了 SO 的内外,但仍然不知道这是否可以做到。我有一个看起来像这样的表:

User ID | Role | First Name | Last Name | Email |<br>
0001    | K    | John       | Smith     | e@e.co|<br>
0002    | Q    | Jane       | Dickens   | q@q.co|<br>
0003    | K    | John       | Smith     | e@e.co|<br>
0004    | J    | Jack       | Paper     | j@j.co|<br>

如您所见,由于用户两次分别输入了他们的信息,因此该表包含重复项。我想显示那些

  • 1。有相同的名字
  • 2。有相同的姓氏
  • 3。有相同的电子邮件
  • 4。没有相同的用户 ID

    我可以让前三个条件与内部连接子查询一起使用,但是当我尝试添加第四个条件时,我得到了 0 个返回结果。

    提前感谢您的帮助!

  • 【问题讨论】:

      标签: mysql duplicates multiple-conditions


      【解决方案1】:

      我认为您想删除重复的行。仅按 group by 计数并删除重复行。

      select * from tb_users
           group by first_name, last_name, email
          having count(*) > 1
      

      【讨论】:

        【解决方案2】:

        我会使用 count(*) 和 group by 子句。

        像这样 SELECT count(*) as count FROM table group by concat(firstname,'\n',last_name) 具有count=1;

        【讨论】:

          【解决方案3】:

          我假设您的表不包含真正的重复行(其中用户 ID 也匹配)。我认为恢复相关行应该像这样简单(使用我调整后的列和表命名方案):

          SELECT ui.user_id, ui.role, ui.first_name, ui.last_name, ui.email
          FROM user_info AS ui
            INNER JOIN user_info AS udi
              ON ui.first_name = udi.first_name
                AND ui.last_name = udi.last_name
                AND ui.email = udi.email
                AND ui.user_id != udi.user_id;
          

          【讨论】:

            【解决方案4】:

            尝试类似:

            select *
              from tb_users
             where (first_name, last_name, email) in
               (select first_name, last_name, email
                  from tb_users
                 group by first_name, last_name, email
                having count(*) > 1)
            

            【讨论】:

              【解决方案5】:
              SELECT GROUP_CONCAT(`User ID`) as IDs, Role, `First Name`, `Last Name`, Email
              FROM users_table
              GROUP BY Role,`First Name`,`Last Name`,Email
              

              会给出一个类似的表格

              IDs       | Role | First Name | Last Name | Email |
              0001,0003 |   K  |    John    |   Smith   | e@e.co|
              0002      |   Q  |    Jane    |  Dickens  | q@q.co|
              0004      |   J  |    Jack    |   Paper   | j@j.co|
              

              诀窍是GROUP BY 除了ID 之外的所有内容。

              你也可以这样做:

              SELECT COUNT(`User ID`) as numIDs, GROUP_CONCAT(`User ID`) as IDs, 
                     Role, `First Name`, `Last Name`, Email
              FROM users_table
              GROUP BY Role,`First Name`,`Last Name`,Email
              HAVING numIDs > 1
              

              得到

              numIDs |IDs       | Role | First Name | Last Name | Email |
                  2  |0001,0003 |   K  |    John    |   Smith   | e@e.co|
              

              无论如何,你明白如何根据你的目的改变它。

              【讨论】:

              • 这很可能是我正在使用的,它仍然不是我想要获得的结果,但是 group_concat 推动了我。非常感谢!
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2017-07-29
              • 2014-01-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-02-27
              • 1970-01-01
              相关资源
              最近更新 更多