2

I have inherited a table that provides a link between two other tables that looks like this:

id | product_id | category_id
1 | 10 | 20 
2 | 10 | 21
3 | 34 | 20
4 | 34 | 21
5 | 34 | 21
6 | 10 | 21

In there, it turns out that row 2 and 6, and rows 4 and 5 are pairs.

How can I write a query to delete the redundant rows?

4

3 に答える 3

1

重複排除された値を保持する一時テーブルを作成します。

CREATE TABLE y LIKE x;

重複排除された値を挿入します。

INSERT INTO y (product_id, category_id)
SELECT product_id, category_id FROM x
GROUP BY product_id, category_id;

テーブルを交換します。

DROP TABLE x;
ALTER TABLE y RENAME x;

これで、一意のキーを追加し(product_id, category_id)て、さらに重複が挿入されるのを防ぐことができます。

于 2013-09-28T11:17:21.543 に答える
1

product_idとに一意のキーを追加する必要がありcategory_idます。そうすると、挿入が失敗するため、冗長な行を追加できなくなります。

ただし、冗長な行を最初に削除した場合にのみ、これを行うことができます。次のようにグループ化することで、それらを見つけることができます。

 SELECT id FROM table GROUP BY product_id, category_id HAVING COUNT(*) > 1

その後、結果から ID を取得して「,」で区切り、次の削除クエリを実行できます。

DELETE FROM table WHERE id IN({comma separated list of id})
于 2013-09-28T11:04:06.757 に答える
1
ALTER IGNORE TABLE 'tablename' ADD UNIQUE INDEX idx_name (id, product_id, category_id);

これにより、今後テーブルに重複がなくなることも保証されます。

詳細情報: MySQL で重複する行を削除する

于 2013-09-28T11:08:57.377 に答える