Consulta SQL

Muy buenas, tengo una tabla en MySQL con una columna de id de usuario, y dirección de correo electrónico, y me gustaría hacer una consulta que me devuelva los registros cuya dirección de correo electrónico aparezca tres o más veces. ¿Me podéis echar una mano? Debe ser con una consulta, ya que la estructura de la tabla es inamovible.
Asi a priori se me ocurre que puedes recurrir a una subconsulta, algo como

select count(email), email from tablaX
group by email;


Y que eso sea una subconsulta de otra consulta principal que lo use para comparar.
Voy a hacer una prueba y si eso ahora edito XD
4s|m3tr|ko0 escribió:Muy buenas, tengo una tabla en MySQL con una columna de id de usuario, y dirección de correo electrónico, y me gustaría hacer una consulta que me devuelva los registros cuya dirección de correo electrónico aparezca tres o más veces. ¿Me podéis echar una mano? Debe ser con una consulta, ya que la estructura de la tabla es inamovible.



La siguiente debería ser la correcta:


SELECT email FROM tabla_usuarios GROUP BY email HAVING COUNT(email) > 2;

Editado: Si además quieres que aparezca el número de veces que se repite:

SELECT email, COUNT(email) FROM tabla_usuarios GROUP BY email HAVING COUNT(email) > 2;
lo malo es que entonces no dispongo de los logins, solo los emails, y debido a las características del proyecto me interesa que MySQL haga la mayor cantidad de trabajo posible para liberar al cliente.
4s|m3tr|ko0 escribió:lo malo es que entonces no dispongo de los logins, solo los emails
Hombre, pero usando la misma sentencia que el te ha dado, solo cambiando el SELECT a tu gusto, ya te vale, no? XD
4s|m3tr|ko0 escribió:lo malo es que entonces no dispongo de los logins, solo los emails, y debido a las características del proyecto me interesa que MySQL haga la mayor cantidad de trabajo posible para liberar al cliente.

Si la versión de mysql que usas soporta subconsultas, prueba lo siguiente:

SELECT * FROM tabla_usuario WHERE email IN (SELECT email FROM tabla_usuarios GROUP BY email HAVING COUNT(email) > 2);


En caso de que no soportase subconsultas, deberías ejecutar primero la subconsulta:

SELECT email FROM tabla_usuarios GROUP BY email HAVING COUNT(email) > 2;


Y luego, utilizando los valores obtenidos en dicha subconsulta, separados por coma "," sustituir en la primera consulta:

SELECT * FROM tabla_usuario WHERE email IN (valores,separados,por,comas);
jeje, al final ésta mañana lo he conseguido solucionar, del siguiente modo:
SELECT `tabla`.`user`, `tabla`.`email`
FROM `tabla`

INNER JOIN

(SELECT `email`
FROM `tabla`
GROUP BY(`email`)
HAVING COUNT(`account_id`)>1) AS repetidos

ON `tabla`.`email` = `repetidos`.`email` ORDER BY `tabla`.`email`;


Qué os parece?, de todos modos probaré vuestras opciones, a ver si alguna queda más limpia.

Muchas gracias!!!
6 respuestas