删除除一条重复记录以外的所

时间:2011-05-04 11:30:10

标签: sql sql-delete

我有一个表应该保留给定配置文件的访问者跟踪(用户ID到用户ID对)。事实证明我的SQL查询有点偏,并且正在生成多对而不是单个对。事后我应该对每个id + id对强制执行一个唯一约束。

现在,我该如何清理餐桌?我想要做的是删除所有重复的对,只留一个。

所以例如改变这个:

23515 -> 52525 date_visited
23515 -> 52525 date_visited
23515 -> 52525 date_visited
12345 -> 54321 date_visited
12345 -> 54321 date_visited
12345 -> 54321 date_visited
12345 -> 54321 date_visited
23515 -> 52525 date_visited
...

进入这个:

23515 -> 52525 date_visited
12345 -> 54321 date_visited

更新:这是所请求的表结构:

id  int(10)         UNSIGNED    Non     Aucun   AUTO_INCREMENT
profile_id  int(10)         UNSIGNED    Non     0 
visitor_id  int(10)         UNSIGNED    Non     0
date_visited    timestamp           Non     CURRENT_TIMESTAMP   

5 个答案:

答案 0 :(得分:45)

在子查询中使用group by:

delete from my_tab where id not in 
(select min(id) from my_tab group by profile_id, visitor_id);

你需要某种独特的标识符(这里,我正在使用id)。

更新

正如@JamesPoulson指出的那样,这会导致MySQL语法错误;正确的解决方案是(如James' answer所示):

delete from `my_tab` where id not in
( SELECT * FROM 
    (select min(id) from `my_tab` group by profile_id, visitor_id) AS temp_tab
);

答案 1 :(得分:14)

这是Frank Schmitt的解决方案,其中包含临时表的小型解决方法:

delete from `my_tab` where id not in
( SELECT * FROM 
    (select min(id) from `my_tab` group by profile_id, visitor_id) AS temp_tab
)

答案 2 :(得分:3)

这将有效:

With NewCTE
AS
(
Select *, Row_number() over(partition by ID order by ID)as RowNumber from 
table_name
)
Delete from NewCTE where RowNumber > 1

答案 3 :(得分:2)

选择所有唯一的行
将它们复制到新的临时表中 截断原始表
将临时表数据复制到原始表

这就是我要做的。我不确定是否有1个查询可以为您完成所有这些。

答案 4 :(得分:-1)

如果您使用的是SQL,则可以按照以下步骤手动删除保留一个条目的重复行:

  1. 进入您有重复数据的表。
  2. 应用过滤器为每个ID隔离重复数据
  3. 选择所有要删除的行。
  4. 按Delete键并保存结果。
  5. 对每个具有重复条目的ID重复此过程。

这是一个漫长的过程,但是您可以立即实时查看结果。

希望此解决方案对您有用!