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)

bobo
fuente

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
)
Scott Saunders
fuente
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.

Ivan Nevostruev
fuente
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
Sergey Makhonin
fuente
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 != ''
    )
ramesh kumar
fuente
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 [email protected] como valor de login_id.

Marc L
fuente
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
Libertino
fuente
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) 
Suba Karthikeyan
fuente