Найти строки, которые имеют одинаковое значение в столбце в MySQL


209

В таблице [member] некоторые строки имеют одинаковое значение для emailстолбца.

login_id | email
---------|---------------------
john     | john123@hotmail.com
peter    | peter456@gmail.com
johnny   | john123@hotmail.com
...

Некоторые люди использовали другой login_id, но тот же адрес электронной почты, для этого столбца не было установлено никаких уникальных ограничений. Теперь мне нужно найти эти строки и посмотреть, должны ли они быть удалены.

Какой оператор SQL я должен использовать, чтобы найти эти строки? (MySQL 5)

Ответы:


342

Этот запрос даст вам список адресов электронной почты и сколько раз они использовались, в первую очередь наиболее часто используемые адреса.

SELECT email,
       count(*) AS c
FROM TABLE
GROUP BY email
HAVING c > 1
ORDER BY c DESC

Если вы хотите полные строки:

select * from table where email in (
    select email from table
    group by email having count(*) > 1
)

1
count(1)работает одинаково хорошо, и является более производительным. (Узнал этот трюк от переполнения стека ;-)
jpaugh

3
@jpaugh, возможно, не захочется использовать count(1) stackoverflow.com/questions/2710621/…
Шторм

создал то, что было по сути бесконечной рекурсией или что-то в MySQL, что привело к мертвой базе данных из-за «слишком большого количества соединений»: - /
huygir


14

Вот запрос для поиска email, которые используются для более чем одного login_id:

SELECT email
FROM table
GROUP BY email
HAVING count(*) > 1

Вам понадобится второй (вложенный) запрос, чтобы получить список login_idпо email.


10

Первая часть принятого ответа не работает для MSSQL.
Это сработало для меня:

select email, COUNT(*) as C from table 
group by email having COUNT(*) >1 order by C desc

5

используйте это, если ваш почтовый столбец содержит пустые значения

 select * from table where email in (
    select email from table group by email having count(*) > 1 and email != ''
    )

3

Я знаю, что это очень старый вопрос, но это больше для кого-то, у кого может быть такая же проблема, и я думаю, что это более точно соответствует тому, что нужно.

SELECT * FROM member WHERE email = (Select email From member Where login_id = john123@hotmail.com) 

Это вернет все записи, которые имеют john123@hotmail.com в качестве значения login_id.


2

Спасибо, ребята :-) Я использовал ниже, потому что я заботился только об этих двух столбцах, а не столько об остальных. Работал отлично

  select email, login_id from table
    group by email, login_id
    having COUNT(email) > 1

2
В рассматриваемом случае COUNT (электронная почта) всегда будет равен 1, поэтому ваш запрос ничего не даст.
jutky

1
Нет, запрос фактически дал мне данные, которые мне были нужны, в частности, это адрес электронной почты и логин тех, у кого один и тот же адрес электронной почты
Libertine,

Если вы группируете по электронной почте и login_id, вы посчитаете количество строк для одного и того же адреса электронной почты и имени входа, и они различны в вашем примере, поэтому счетчик всегда будет равен 1. Вот скрипка с вашим запросом, которая возвращает 0 строк: sqlfiddle. com / #! 9 / 4bbcaf / 3
jutky

1

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

SELECT *
FROM   member
WHERE  email IN (SELECT email
                 FROM   member
                 WHERE  login_id = abcd.user@hotmail.com) 
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.