我在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子句并说删除重复行吗?
答案 0 :(得分:2)
尽管您的查询工作得很好,但是您可以在下面尝试-
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
)
答案 1 :(得分:1)
我将采用另一种方法,并通过以下查询选择数据最完整的那些记录:
select
max(id), max(apn), max(title), max(genre), max(trailer)
from movies
这将为您提供最完整的答案。
希望这会有所帮助:)
答案 2 :(得分: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)
它将删除没有预告片,流派或标题的行。