0

私は次のようなテーブルを持っています

table_id  item_id  vendor_id  category_id
   1         1       33           4
   2         1       33           4 
   3         1       33           2 
   4         2       33           4
   5         2       33           2
   6         3       33           4
   7         3       33           4 
   8         1       34           4 
   9         1       34           4 
   10        3       35           4 

table_idこれは、クエリを実行して見つけた61個の重複エントリを含む、合計98000個のエントリを持つ主キーとテーブルです

 SELECT * FROM my_table 
 WHERE vendor_id = 33 
 AND category_id = 4 
 GROUP BY item_id having count(item_id)>1

上記の表ではtable_id、1,2 と 6,7 が重複しています。テーブルから 2 と 7 を削除する必要があります (合計 61 の重複エントリ)。where 句 vendor_id = 33 AND category_id = 4 を含むクエリを使用して、テーブルから重複するエントリを削除するにはどうすればよいですか? table_id8,9などの他の重複エントリを削除したくない

必要な重複エントリを保持する必要があるため、テーブルにインデックスを付けることができません。特定の基準で重複を削除する必要があります

4

5 に答える 5

1

削除クエリを実行する前に、必ずバックアップを取ってください。

次のように使用してみてくださいLEFT JOIN:

DELETE my_table
  FROM my_table
  LEFT JOIN 
  (SELECT MIN(table_id) AS IDs FROM my_table
   GROUP BY `item_id`, `vendor_id`, `category_id`
  )A
  ON my_table.table_id = A.IDs
  WHERE A.ids IS NULL;

削除後の結果:

| TABLE_ID | ITEM_ID | VENDOR_ID | CATEGORY_ID |
------------------------------------------------
|        1 |       1 |        33 |           4 |
|        3 |       1 |        33 |           2 |
|        4 |       2 |        33 |           4 |
|        5 |       2 |        33 |           2 |
|        6 |       3 |        33 |           4 |

このSQLFiddleを参照してください


編集:(OPの編集後)

WHEREさらに条件を追加する場合は、次のように外部条件に追加できます。

DELETE my_table
  FROM my_table
  LEFT JOIN 
  (SELECT MIN(table_id) AS IDs FROM my_table
   GROUP BY `item_id`, `vendor_id`, `category_id`
  )A
  ON my_table.table_id = A.IDs
  WHERE A.ids IS NULL
  AND vendor_id = 33   --< Additional conditions here
  AND category_id = 4  --< Additional conditions here

このSQLFiddleを参照してください

于 2013-08-06T07:10:54.150 に答える
0

試す

DELETE m 
  FROM my_table m JOIN 
(
  SELECT MAX(table_id) table_id
    FROM my_table 
   WHERE vendor_id = 33 
     AND category_id = 4 
   GROUP BY item_id, vendor_id, category_id 
  HAVING COUNT(*) > 1
) q ON m.table_id = q.table_id

削除すると、次のようになります

| | テーブル ID | ITEM_ID | VENDOR_ID | CATEGORY_ID |
------------------------------------------------
| | 1 | 1 | 33 | 4 |
| | 3 | 1 | 33 | 2 |
| | 4 | 2 | 33 | 4 |
| | 5 | 2 | 33 | 2 |
| | 6 | 3 | 33 | 4 |
| | 8 | 1 | 34 | 4 |
| | 9 | 1 | 34 | 4 |
| | 10 | 3 | 35 | 4 |

これがSQLFiddleのデモです

于 2013-08-06T07:57:46.393 に答える
0

これはどうですか:

DELETE FROM my_table
WHERE table_id NOT IN
    (SELECT MIN(table_id)
     FROM my_table
     GROUP BY item_id, vendor_id, category_id)
于 2013-08-06T07:07:55.013 に答える