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

问题描述 投票:27回答:4

我有一个表,应该保留给定配置文件的访问者的痕迹(用户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   
sql sql-delete
4个回答
45
投票

在子查询中使用group by:

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

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

UPDATE

正如@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
);

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
)

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

2
投票

选择所有唯一行 将它们复制到新的临时表 截断原始表格 将临时表数据复制到原始表 这就是我要做的。我不确定是否有1个查询可以为您完成所有这些操作。

© www.soinside.com 2019 - 2024. All rights reserved.