我有一个表应该保留给定配置文件的访问者跟踪(用户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
答案 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,则可以按照以下步骤手动删除保留一个条目的重复行:
这是一个漫长的过程,但是您可以立即实时查看结果。
希望此解决方案对您有用!