【问题标题】:Delete MySQL row where multiple indexes are the same, but keep the most recent删除多个索引相同的 MySQL 行,但保留最新的
【发布时间】:2014-04-11 14:28:56
【问题描述】:

这是我的桌子的样子
=========================================
||身份证 | collection_id | product_id |价格 ||
=========================================
|| 1  | 1    | 1   | 2.50  ||
|| 2  | 1    | 1   | 2.60  ||
|| 3  | 1    | 1   | 2.40  ||
|| 4  | 2    | 1   | 2.50  ||
=========================================

这是我想要实现的目标的粗略概述; 使用一些伪代码。

我想要做的是 DELETE FROM 价格 WHERE (collection_ id && product_ id 是重复) AND WHERE (id

所以我想用简单的英语做的是删除 id 等于 1 和 2 的行,但保留 id 等于 3 的行,因为这是最新的。

【问题讨论】:

    标签: mysql duplicates relational-database delete-row


    【解决方案1】:

    一个简单的DELETE JOIN 就可以了;删除至少存在一行与collection_idproduct_id 匹配且id 的值更大的所有行;

    DELETE p1
    FROM prices p1
    JOIN prices p2
      ON p1.collection_id = p2.collection_id
     AND p1.product_id = p2.product_id
     AND p1.id < p2.id
    

    An SQLfiddle to test with,并记得在运行更新或删除互联网上的随机人之前始终备份您的数据。

    【讨论】:

    • 感谢您的提示,但在我理解之前我不会运行它。我可以从小提琴中看到它有效,但我看不出如何。 p1 和 p2 来自哪里?如果有五十个值会发生什么?这是伪表吗?
    • 好的,所以我已经用 10 行测试了这个,它可以工作,你能解释一下这是做什么的吗?
    • @gcoulby 基本上,它是一个普通的JOIN。该查询从表prices 中选择两行,并将它们命名为p1p2。如果条件为真(即它们的行匹配并且 p1 具有较低的 id),我们从表中删除 p1。然后它基本上对表中的每个行组合重复,因此最终结果是所有具有更大 id 的匹配行的行都已被删除。
    • 啊,这很有意义。我没有在这个项目中使用它,但这对于第二个项目非常方便。在这个项目中,我输入了在输入时检测到重复并自动删除旧的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多