我有一个表,应该保留给定配置文件的访问者的痕迹(用户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
在子查询中使用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
);
这是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
)
这将有效:
With NewCTE
AS
(
Select *, Row_number() over(partition by ID order by ID)as RowNumber from
table_name
)
Delete from NewCTE where RowNumber > 1
选择所有唯一行 将它们复制到新的临时表 截断原始表格 将临时表数据复制到原始表 这就是我要做的。我不确定是否有1个查询可以为您完成所有这些操作。