MySQL - Eliminar registros segun numeros apariciones

 
Vista:
sin imagen de perfil

Eliminar registros segun numeros apariciones

Publicado por lex (5 intervenciones) el 15/06/2018 11:03:46
Hola,
Tego una consulta para comprobar el numero de veces que acceden desde una IP determinada (si son mas de 2000):

1
2
3
4
5
SELECT IP, count(*) as TOTAL
FROM tabla
group BY IP
having TOTAL>2000
order by TOTAL DESC

¿Como puedo hacer para eliminar los que aparezacan más de X veces? (por ejemplo más de 2000)

Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Eliminar registros segun numeros apariciones

Publicado por leonardo_josue (414 intervenciones) el 18/06/2018 17:13:11
Hola Lex:

Puedes utilizar la opción del JOIN en el DELETE para eliminar los registros, aquí un ejemplo.

Supongamos que tienes esta tabla;

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> SELECT * FROM tabla;
+--------+
| campo1 |
+--------+
|      1 |
|      2 |
|      2 |
|      2 |
|      3 |
|      4 |
|      4 |
+--------+
7 rows in set (0.00 sec)

entonces, si haces un COUNT, agrupando por el campo1, obtienes lo siguiente:

1
2
3
4
5
6
7
8
9
10
mysql> SELECT campo1, count(1) total FROM tabla GROUP BY campo1;
+--------+-------+
| campo1 | total |
+--------+-------+
|      1 |     1 |
|      2 |     3 |
|      3 |     1 |
|      4 |     2 |
+--------+-------+
4 rows in set (0.00 sec)

supongamos que quieres eliminar los registros que tengan un COUNT > 1 (es decir, los campos 2 y 4), podrías filtrar con HAVING:

1
2
3
4
5
6
7
8
mysql> SELECT campo1 total FROM tabla GROUP BY campo1 HAVING count(1) > 1;
+-------+
| total |
+-------+
|     2 |
|     4 |
+-------+
2 rows in set (0.00 sec)

entonces, para evitar el error que de aparece si quieres filtrar con el IN por hacer referencia a la misma tabla, lo haces con un INNER JOIN:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> DELETE tabla
    -> FROM tabla INNER JOIN
    -> (SELECT campo1 FROM tabla GROUP BY campo1 HAVING COUNT(1) > 1) tabla2
    -> ON tabla.campo1 = tabla2.campo1;
Query OK, 5 rows affected (0.09 sec)
 
mysql> SELECT * FROM tabla;
+--------+
| campo1 |
+--------+
|      1 |
|      3 |
+--------+
2 rows in set (0.00 sec)

Haz la prueba y nos comentas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar