1

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

    在此先感谢您的帮助!

  • 4

    5 回答 5

    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|
    

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

    于 2012-01-30T05:22:40.683 回答
    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)
    
    于 2012-01-30T05:23:34.247 回答
    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;
    
    于 2012-01-30T05:23:46.010 回答
    0

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

    就像这个 SELECT count(*) as countFROM table group by concat(firstname,'\n',last_name) 有count=1;

    于 2012-01-30T05:26:38.430 回答
    0

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

    select * from tb_users
         group by first_name, last_name, email
        having count(*) > 1
    
    于 2012-01-30T05:26:41.827 回答