2012-05-11 11 views
7

これですでにここにいくつかの投稿がありますが、ウェブ上にまだ少ない記事があります。私は文字通りそれらのすべてを試しましたが、何もすることはできません。うまくいけば、ここの誰かが私に同情を取ることができます:)MySQLで数値(*)を削除します

ここに私が働いているデータです。これらのレコードをすべて削除したいと思います。

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) 

これを行うコードに最も近いのは以下のとおりです。構文はokをチェックして実行されますが、データベースが停止しているようです。私はそれを10分ほど走らせて、何も起こらないようにして、私はそれを中止します。

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

ここ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

はなぜ2つです異なるクエリを選択すると、最初のクエリは2番目のクエリと異なりますか?また、1092 + 1401 + 1411 + 1997 + 3425 = 9,326レコードを削除しますか? – Rippo

+0

何を意味するのかわからないのですか? 1つは、私が取り除きたいデータを表示しています。もう1つは、カウントを使用している間にdeleteステートメントをフォーマットするために推奨される方法です。 –

+0

はい、私はすべての9k +レコードを取り除きたいと思います。 –

答えて

10

tmpのテーブルの上に計画を説明します:

現在、あなたがテーブルから削除し、サブクエリで同じテーブルから選択することはできません。

私はあなたが一時テーブルを経由してこの操作を実行する必要がありますと思う:

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

ありがとうございましたeggyal、私は実際にそれを試みましたが、それは一時テーブルに5レコードを作成します。レコード数ではなくグループ化された行数? –

+0

@RFQMaster:そうですが、5つの説明のいずれかにマッチする 'ag_master'からすべてのレコードを削除します(これはあなたの後ろのものです、いいえ?)。 – eggyal

+0

ああ、あなたが言っていることが分かります。私はそれを試してみましょう... –

5

別のオプションは、インナーを使用しているが、結果をフィルタリングするために参加する:

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 
関連する問題