删除MySQL中具有条件的重复行

删除MySQL中具有条件的重复行,mysql,Mysql,我在mysql数据库中有一个名为“Movies”的表,它有同一部电影的多条记录。标识符是“APN”字段 我试图删除所有多行,但保留一条信息更完整的记录 例如,在下面的记录中,我想删除前两行,但保留第三行,因为它有更完整的信息,包括拖车url +----+----------+---------+--------+-----------+ Id APN Title Genre Trailer +----+----------+---------+--------+

我在mysql数据库中有一个名为“Movies”的表,它有同一部电影的多条记录。标识符是“APN”字段

我试图删除所有多行,但保留一条信息更完整的记录

例如,在下面的记录中,我想删除前两行,但保留第三行,因为它有更完整的信息,包括拖车url

+----+----------+---------+--------+-----------+
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;
从电影m1中删除m1
内部连接模块m2
其中m1.id

我可以在查询中使用where子句,并在某些列为空时说delete DUPLICAES rows吗?

虽然您的查询在FIDLE中运行良好,但您可以在下面进行尝试-

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

                )

我将采用不同的方法,通过使用以下查询选择数据最完整的记录:

select 
max(id), max(apn), max(title), max(genre), max(trailer)
from movies
这将为您提供最完整的答案


希望这有帮助:)

您也可以使用以下查询:

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)

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

如果第一行有预告片,而第三行没有预告片,您会怎么做?哪一个将被删除,哪一个将保留?如果拖车字段有一个值,则表示它已被“触动”并且保留“良好”。请在演示中运行此操作:插入t1值(11234567,'TinTin',null,null),(21234567,'TinTin','Frient',',),(31234567,'TinTin','Frient',null)当我执行你的查询时,它仍然会显示第三行,而不是第二行。非常感谢。