Конкретный выбор дубликатов в MySQL

Я заглянул внутрь и наружу 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. НЕ имеют одинаковый идентификатор пользователя

    Я могу заставить первые три условия работать с внутренним подзапросом соединения, но я получаю 0 возвращенных результатов, когда пытаюсь добавить четвертое условие.

    Заранее спасибо за помощь!

  • 6 ответов

    Решение
    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|
    

    В любом случае, вы понимаете, как изменить это в соответствии с вашими целями.

    Я думаю, что вы хотите удалить дубликаты строк. Считайте только по группам и удаляйте дублирующиеся строки.

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

    Вам не нужно скачивать расширения; перейдите в левый нижний угол, нажмите «Настройки», нажмите «Сочетания клавиш» и найдите «дублирование». Вы должны увидеть, как показано на изображении ниже, и назначить нужную комбинацию клавиш. Я выбираю Shift+D, потому что не хочу потерять текущее поведение Ctrl+D, это тоже очень полезно.

    Попробуйте что-то вроде:

    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)
    

    Я предполагаю, что ваша таблица не содержит истинных повторяющихся строк (где также совпадает идентификатор пользователя). Я думаю, что это должно быть так же просто, как вернуть соответствующие строки (с моей скорректированной схемой именования столбцов и таблиц):

    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;
    

    Я бы использовал count(*) и group by.

    Как этот счетчик SELECT (*) как count ОТ группы таблиц по concat(firstname,'\n',last_name), имеющему count=1;

    Другие вопросы по тегам