Encuentre filas que tengan el mismo valor en una columna en MySQL


209

En una tabla [miembro], algunas filas tienen el mismo valor para la emailcolumna.

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

Algunas personas usaron un login_id diferente pero la misma dirección de correo electrónico, no se estableció ninguna restricción única en esta columna. Ahora necesito encontrar estas filas y ver si deberían eliminarse.

¿Qué instrucción SQL debo usar para encontrar estas filas? (MySQL 5)

Respuestas:


341

Esta consulta le dará una lista de direcciones de correo electrónico y cuántas veces se usan, primero con las direcciones más usadas.

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

Si quieres las filas completas:

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

1
count(1)funciona igual de bien y es más eficiente. (Aprendí ese truco de Stack Overflow ;-)
— jpaugh

3
@jpaugh, es posible que no quiera usar count(1) stackoverflow.com/questions/2710621/…
— Storm

creó lo que era esencialmente una recursión infinita o algo en mysql que resultó en una base de datos muerta debido a "demasiadas conexiones": - /
— huygir


13

Aquí hay una consulta para encontrar emaillos que se usan para más de uno login_id:

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

Necesitará una segunda consulta (de anidada) para obtener una lista de login_idpor email.


10

La primera parte de la respuesta aceptada no funciona para MSSQL.
Esto funcionó para mí:

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

5

use esto si su columna de correo electrónico contiene valores vacíos

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

3

Sé que esta es una pregunta muy antigua, pero es más para alguien más que podría tener el mismo problema y creo que es más preciso para lo que se quería.

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

Esto devolverá todos los registros que tengan john123@hotmail.com como valor de login_id.


2

Gracias chicos :-) Usé lo siguiente porque solo me importaban esas dos columnas y no tanto por el resto. Funcionó genial

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

2
En el caso en cuestión, COUNT (correo electrónico) siempre sería 1, por lo que su consulta no devolverá nada.
— jutky

No, la consulta de hecho me dio los datos que necesitaba, que es claramente el correo electrónico y login_name de los que tienen el mismo correo electrónico
— Libertine

Si agrupa por correo electrónico y login_id, contará la cantidad de filas para el mismo correo electrónico e inicio de sesión, y esas son distintas en su ejemplo, por lo que el recuento siempre será 1. Aquí está el violín con su consulta que devuelve 0 filas: sqlfiddle. com / #! 9 / 4bbcaf / 3
— jutky

1

Obtenga el registro completo como desee utilizando la condición con la consulta de selección interna.

SELECT *
FROM   member
WHERE  email IN (SELECT email
                 FROM   member
                 WHERE  login_id = abcd.user@hotmail.com) 
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.