2012-05-11 25 views
7

Ok por lo que hay mensajes pareja ya aquí en esto y menos aún en la web. Literalmente he intentado cada uno de ellos y no puedo hacer que nada funcione. Esperemos que alguien aquí puede ten piedad de mí :)BORRAR de tener COUNT (*) en MySQL

Estos son los datos que estoy trabajando. Quiero borrar todos estos registros.

SELECT 
part_desc, count(*) as rec_num 
FROM ag_master 
GROUP BY part_desc HAVING COUNT(*) > 1000; 

+--------------------------------------+---------+ 
| part_desc       | rec_num | 
+--------------------------------------+---------+ 
| SILICON DELAY LINE, TRUE OUTPUT  | 1092 | 
| LOADABLE PLD       | 1401 | 
| 8-BIT, FLASH, 8 MHz, MICROCONTROLLER | 1411 | 
| FPGA         | 1997 | 
| 8-BIT, MROM, 8 MHz, MICROCONTROLLER | 3425 | 
+--------------------------------------+---------+ 
5 rows in set (0.00 sec) 

Lo más parecido que he encontrado para encontrar el código que lo haría se muestra a continuación. La sintaxis se comprueba correctamente y se ejecuta, sin embargo, parece que cuelga la base de datos. Lo dejé correr durante 10 minutos y nunca pasa nada, así que lo aborto.

DELETE 
FROM ag_master 
WHERE part_id IN (
    SELECT part_id 
    FROM ag_master 
    GROUP BY part_desc 
    HAVING COUNT(*) > 1000 
); 

este es el plan explican en la tabla tmp

mysql> EXPLAIN SELECT * FROM ag_master WHERE part_desc IN (SELECT part_desc FROM tmp); 
+----+--------------------+-----------+--------+---------------+------+---------+------+--------+-------------+ 
| id | select_type  | table  | type | possible_keys | key | key_len | ref | rows | Extra  | 
+----+--------------------+-----------+--------+---------------+------+---------+------+--------+-------------+ 
| 1 | PRIMARY   | ag_master | ALL | NULL   | NULL | NULL | NULL | 177266 | Using where | 
| 2 | DEPENDENT SUBQUERY | tmp  | system | NULL   | NULL | NULL | NULL |  1 |    | 
+----+--------------------+-----------+--------+---------------+------+---------+------+--------+-------------+ 
2 rows in set (0.00 sec) 
+0

Por qué son los dos seleccione consultas diferentes, ¿la primera difiere de la segunda? También supongo que quiere borrar 1092 + 1401 + 1411 + 1997 + 3425 = 9,326 registros? – Rippo

+0

¿No estás seguro de lo que quieres decir? Una es solo mostrarle los datos de los que quiero deshacerme, la otra es la manera recomendada de formatear una declaración de eliminación mientras usa el recuento de conteos. –

+0

Sí, quiero deshacerme de todos los 9k + registros. –

Respuesta

10

Como se indica en the manual:

Actualmente, no se puede borrar de una tabla y seleccionar de la misma tabla en una subconsulta .

creo que tendrá que realizar esta operación a través de una tabla temporal:

CREATE TEMPORARY TABLE temp 
    SELECT part_desc 
    FROM  ag_master 
    GROUP BY part_desc 
    HAVING COUNT(*) > 1000; 

DELETE FROM ag_master WHERE part_desc IN (SELECT part_desc FROM temp); 

DROP TEMPORARY TABLE temp; 
+0

Gracias eggyal, de hecho me trataron eso, sino que sólo se crea 5 registros en la tabla temporal, que corresponde a la número de filas por las que está agrupado pero no el número de registros? –

+0

@RFQMaster: Sí, pero entonces se borra todos los registros de 'ag_master' que coinciden en cualquiera de esas descripciones 5 (que es lo que está después, no?). – eggyal

+0

Ah, ya veo lo que dices. Déjame probar eso ... –

5

Otra opción es usar una combinación interna para filtrar el resultado:

DELETE 
    ag_master.* 
FROM 
    ag_master 

    INNER JOIN 
    (
     SELECT 
      part_id 
     FROM 
      ag_master 
     GROUP BY 
      part_desc 
     HAVING COUNT(*) > 1000 
    )AS todelete ON 
      todelete.part_id = ag_master.part_id