MySQL中的特定重复选择

时间:2012-01-30 04:57:58

标签: mysql duplicates multiple-conditions

我确实看过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个返回结果。

    提前感谢您的帮助!

  • 5 个答案:

    答案 0 :(得分:0)

    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 BYID以外的所有内容。

    你也可以这样做:

    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|
    

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

    答案 1 :(得分:0)

    尝试类似:

    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)
    

    答案 2 :(得分:0)

    我假设您的表不包含真正重复的行(用户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;
    

    答案 3 :(得分:0)

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

    喜欢这个 SELECT count(*)as count FROM table group by concat(firstname,'\ n',last_name)count = 1;

    答案 4 :(得分:0)

    我认为您要删除重复的行。只按分组计数并删除重复的行。

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