【问题标题】:Delete duplicate rows in MySQL with a condition使用条件删除 MySQL 中的重复行
【发布时间】:2019-09-23 22:48:17
【问题描述】:

我在 mysql 数据库中有一个名为“电影”的表,它有同一部电影的多条记录。标识符是“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;

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

【问题讨论】:

  • 如果第一排有预告片,而第三排没有预告片,你会怎么做?哪个会被删除,哪个会保留?
  • 如果尾部字段有值意味着它已被“触及”并且可以保留。

标签: mysql


【解决方案1】:

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

DEMO

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

                )

【讨论】:

  • 请在演示中运行:插入 t1 值 (1,1234567,'TinTin',null,null), (2,1234567,'TinTin','Fiction','youtube.xyz' ), (3,1234567,'TinTin','Fiction',null) 并且当我执行您的查询时,它仍将显示第 3 行而不是第 2 行。谢谢
【解决方案2】:

我会采用不同的方法,并使用以下查询选择数据最完整的那些记录:

select 
max(id), max(apn), max(title), max(genre), max(trailer)
from movies

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

希望这会有所帮助:)

【讨论】:

    【解决方案3】:

    你也可以使用查询:

    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)
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-01
      • 2021-01-22
      • 2012-04-10
      • 1970-01-01
      • 1970-01-01
      • 2022-07-18
      • 2018-03-05
      相关资源
      最近更新 更多