Знайдіть рядки з однаковим значенням у стовпці в MySQL


209

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

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

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

Який оператор SQL потрібно використовувати для пошуку цих рядків? (MySQL 5)

Відповіді:


341

Цей запит надасть вам список адрес електронної пошти та кількість разів, коли вони використовуються, спочатку найчастіше використовувані адреси.

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)працює однаково добре і є більш ефективною. (Дізнався цей трюк із Stack Overflow ;-)
jpaugh

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

створив те, що по суті було нескінченною рекурсією чи щось на mysql, що призвело до мертвої бази даних через "занадто багато з'єднань": - /
huygir


13

Ось запит, щоб знайти ті 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, тому запит не поверне нічого.
вигук

Ні, запит фактично дав мені потрібні мені дані, а саме це електронна адреса та ім’я користувача-входу (login_name) тих, хто має той самий електронний лист
Libertine

Якщо ви групуєтесь за електронною поштою та login_id, ви будете рахувати кількість рядків для тієї самої електронної пошти та входу, і вони відрізняються у вашому прикладі, тому кількість завжди буде 1. Ось загадка
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.