在MySQL中按条件删除重复行

3
我在mysql数据库中有一个名为“Movies”的表格,其中同一部电影可能有多条记录。标识符是“APN”字段。
我想删除所有重复行,但保留具有更完整信息的记录。
例如,在下面的记录中,我想删除前两行,但保留第三行,因为它具有更完整的信息,包括预告片网址。
+----+----------+---------+--------+-----------+
Id    APN        Title     Genre    Trailer
+----+----------+---------+--------+------------+
1     1234567    TinTin    NULL      NULL
2     1234567    TinTin    Fiction   NULL
3     1234567    TinTin    Fiction   http://youtube.xyz
+---------------------------------------------------

如果我使用以下查询,它将只删除具有较低 ID 的重复内容。
DELETE m1 FROM movies m1
INNER JOIN movies m2 
WHERE m1.id < m2.id AND m1.apn = m2.apn;

如果某些列为空,我能否在查询中使用where子句并删除重复行?


如果第一行有尾随逗号而第三行没有,你会怎么做?哪一个会被删除,哪一个会保留? - trincot
如果拖车字段有值,意味着它已经被“触摸”并且是“好的”保留。 - snowflakes74
3个回答

2

虽然你的查询在fiddle中运行良好,但你可以尝试以下方法 -

演示

最初的回答:

DELETE m1 FROM t1 m1
where id not in ( select * from 
                    ( select max(id) from t1 where Trailer is not null group by apn
                    ) A

                )

请在演示中运行以下代码:insert into t1 values (1,1234567,'TinTin',null,null), (2,1234567,'TinTin','Fiction','http://youtube.xyz'), (3,1234567,'TinTin','Fiction',null)。当我执行您的查询时,它仍将显示第三行而不是第二行。谢谢。 - snowflakes74

1
我会采取不同的方法,选择那些数据最完整的记录,使用以下查询语句:
select 
max(id), max(apn), max(title), max(genre), max(trailer)
from movies

这将为您提供最完整答案的行。

希望对您有所帮助 :)


1
您也可以使用查询:
DELETE m1 FROM movies m1
INNER JOIN movies m2 
ON m1.apn = m2.apn
WHERE m1.id != m2.id AND (m1.Trailer IS NULL OR m1.Genre IS NULL OR m1.Title IS NULL)

它将删除没有预告片、类型或标题的行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接