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

Jam*_* P. 31 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
...
Run Code Online (Sandbox Code Playgroud)

进入:

23515 -> 52525 date_visited
12345 -> 54321 date_visited
Run Code Online (Sandbox Code Playgroud)

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

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   
Run Code Online (Sandbox Code Playgroud)

Fra*_*itt 51

在子查询中使用group by:

delete from my_tab where id not in 
(select min(id) from my_tab group by profile_id, visitor_id);
Run Code Online (Sandbox Code Playgroud)

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

UPDATE

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

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
);
Run Code Online (Sandbox Code Playgroud)

  • 注意,这在MySQL中不起作用,因为它不允许你修改你在内部选择中使用的表:`错误代码:1093.你不能在FROM子句中为更新指定目标表'my_tab' ` (2认同)

Jam*_* P. 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
)
Run Code Online (Sandbox Code Playgroud)


小智 5

这将起作用:

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