我需要在表格中查找和删除重复项,同时记录要删除的记录的ID,并将它们添加到“deleted_ids”字段。
例如,这是我目前的一部分表:
+--------+-------------------------------------------------------+
| Id | Name |
+--------+-------------------------------------------------------+
| 9627 | John Smith |
| 9657 | John Smith |
| 24455 | John Smith |
| 67435 | John Smith |
+--------+-------------------------------------------------------+
我想要达到的结果是:
+--------+-----------------------------+-------------------------+
| Id | Name | Deleted_Ids |
+--------+-----------------------------+-------------------------+
| 9627 | John Smith | 9657,24455,67435 |
+--------+-----------------------------+-------------------------+
我愿意接受任何实际的方法,如果有人能提供解决方案或提出建议,我会非常感激。
谢谢, 保罗
答案 0 :(得分:4)
不要使用其他列 - 以逗号分隔列表存储ID感觉不对,是吗?
最好的是有一个第二个表有两列PrimaryUserId和DeletedUserId - 例如,PrimaryUserId将是“9627” - 你实际保留的记录之一,你将为从主要删除的每个副本添加一行表。此方法还允许您存储一个知道何时删除重复条目的列。
答案 1 :(得分:2)
如果你想这样做,这是一个简单的方法
在一次交易中完成所有这一切以确保
如果'John Smith'
中已有tbl_del
条目,则必须检查并UPDATE
添加已删除的ID。
BEGIN;
INSERT INTO tbl_del
SELECT name, GROUP_CONCAT(id) AS deleted
FROM tbl_live
WHERE name = 'John Smith'
GROUP BY 1;
DELETE FROM tbl_live
WHERE name = 'John Smith';
COMMIT;
但我认为Veseliq有一个不起眼的地方。
答案 2 :(得分:1)
基本方法可以是先从旧表中选择所有符合删除条件的行 - > 将这些行插入新表 - > 从旧表中删除所有行
INSERT INTO new_table
SELECT id,name FROM old_table WHERE id >
(
SELECT min(id) FROM old_table B
WHERE A.name = B.name
);
delete FROM old_table WHERE id >
(
SELECT min(id) FROM old_table B
WHERE A.name = B.name
);
您可以在新表中使用自动递增键。 我没有运行这些查询,请原谅我,如果这里有一些错误,那只是为了一个想法。 在这两个表中具有一对多的关系在将来真的很方便....并且更容易查询数据