2009-11-23 30 views
142

En una tabla [miembro], algunas filas tienen el mismo valor para la columna email.Buscar filas que tienen el mismo valor en una columna en MySQL

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

Algunas personas utilizaron 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 deben eliminarse.

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

Respuesta

227

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

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

Si desea que las filas completas:

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

'count (1)' funciona igual de bien, y es más eficiente. (Aprendí ese truco de [so] ;-) – jpaugh

+3

No funciona con postgres. – jhrr

+1

@jpaugh, puede que no quiera usar 'count (1)' https://stackoverflow.com/questions/2710621/count-vs-count1-vs-countpk-whichisbetter – Storm

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

La respuesta aceptada no funciona con Postgres, éste lo hace. – azio

+0

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

10

A continuación se consulta para encontrar email 's que se utilizan para más de una login_id:

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

Tendrá segundo (de anidada) de consulta para obtener la lista de login_id por email.

9

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 
1

Gracias chicos :-) he usado el siguiente porque sólo se preocupaba por esas dos columnas y no tanto sobre el resto. Trabajado gran utilidad

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

En el caso en cuestión, COUNT (correo electrónico) siempre será 1, por lo que su consulta no arrojará nada. – jutky

2

esta columna si su 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 != '' 
    ) 
Cuestiones relacionadas