我继承了一个表,它提供了另外两个表之间的链接:
id | product_id | category_id
1 | 10 | 20
2 | 10 | 21
3 | 34 | 20
4 | 34 | 21
5 | 34 | 21
6 | 10 | 21
在那里,结果是第2行和第6行,第4行和第5行是成对的。
如何编写查询以删除冗余行?
答案 0 :(得分: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})
答案 1 :(得分:1)
ALTER IGNORE TABLE 'tablename' ADD UNIQUE INDEX idx_name (id, product_id, category_id);
这也将确保表格中不再有重复。
答案 2 :(得分: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)
上添加唯一键,以防止插入更多重复项。