2009-11-23 2 views
142

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

login_id | email 
---------|--------------------- 
john  | [email protected] 
peter | [email protected] 
johnny | [email protected] 
... 

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

Какой SQL-оператор следует использовать для поиска этих строк? (MySQL 5)

ответ

227

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

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 
) 
+0

'count (1)' работает одинаково хорошо и более совершенен. (Узнал, что трюк от [so] ;-) – jpaugh

+3

Не работает с postgres. – jhrr

+1

@jpaugh, возможно, не захочет использовать 'count (1)' https://stackoverflow.com/questions/2710621/count-vs-count1-vs-countpk-which-is-better – Storm

44
select email from mytable group by email having count(*) >1 
+4

Принятый ответ не работает с Postgres, это делает. – azio

+0

@HLGEM: http://stackoverflow.com/questions/41359879/postgresql-get-records-having-similar-column-values ​​ –

10

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

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

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

9

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

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

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

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

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

2

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

select * from table where email in (
    select email from table group by email having count(*) > 1 and email != '' 
    ) 
Смежные вопросы

 Смежные вопросы