2012-05-11 2 views
7

Ok, so gibt es paar Beiträge hier bereits auf diesem und noch weniger im Internet. Ich habe buchstäblich jeden von ihnen ausprobiert und kann nichts zur Arbeit bringen. Hoffentlich kann jemand hier Mitleid mit mir haben :)LÖSCHEN VON HABEN ZÄHL (*) in MySQL

Hier ist die Daten, mit denen ich arbeite. Ich möchte alle diese Datensätze löschen.

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) 

Der nächstgelegene ich zu finden Code gekommen, dass es unten gezeigt wird tun würde. Die Syntax überprüft ok und es läuft, aber es scheint nur die Datenbank aufhängen. Ich habe es so lange wie 10 Minuten laufen lassen und nichts passiert, also brich ich es ab.

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

Hier ist der Plan auf der tmp Tabelle in the manual

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

Warum sind die beiden Suchabfragen anders wählen, deine erste unterscheidet sich von deiner zweiten? Auch ich nehme es Sie wollen 1092 + 1401 + 1411 + 1997 + 3425 = 9.326 Datensätze löschen? – Rippo

+0

Nicht sicher, was du meinst? Einer zeigt Ihnen nur die Daten, die ich loswerden möchte, der andere ist der empfohlene Weg, um eine Löschanweisung zu formatieren, während die Zählung verwendet wird. –

+0

Ja, ich möchte alle 9k + Datensätze loswerden. –

Antwort

10

Wie bereits erwähnt erklären:

Derzeit können Sie nicht aus einer Tabelle löschen und wählen Sie aus derselben Tabelle in einer Unterabfrage .

Ich glaube, Sie werden diesen Vorgang über eine temporäre Tabelle zu erfüllen haben:

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

Dank eggyal, ich habe es tatsächlich versucht, aber es erstellt nur 5 Datensätze in der temporären Tabelle, die der entspricht Anzahl der Zeilen, nach denen es gruppiert ist, aber nicht die Anzahl der Datensätze? –

+0

@RFQMaster: Ja, aber dann löschst du alle Datensätze von 'ag_master', die mit einer dieser 5 Beschreibungen übereinstimmen (was ist deine Absicht, nein?). – eggyal

+0

Ah, ich verstehe was du sagst. Lass mich das ausprobieren ... –

5

Eine weitere Option eine innere verwendet verbinden das Ergebnis zu filtern:

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