【问题标题】:delete all non-duplicate rows but keep one删除所有非重复行但保留一个
【发布时间】:2016-02-25 12:23:27
【问题描述】:

在 MySQL 中,我有一个这样的表

book | user | phone
445    a       69
445    g       75
445    e       22
445    l       55
332    w       57
332    u       34
332    v       87
881    o       49

我想删除所有包含 book 445book 332 的行,并在末尾随机只保留其中一个。

所以桌子会变成

book | user | phone
445    l       55
332    w       57
881    o       49

如何在 SQL 中执行此操作?我使用 phyMyAdmin 和 PHP 5.6

谢谢

【问题讨论】:

  • 保留445,l而不是445,a/g/e的逻辑是什么?
  • @AlexK。真的没什么。是随机的。只保留其中一个。谢谢

标签: php mysql sql sql-delete delete-row


【解决方案1】:

你去吧:

DELETE FROM table1 t1, table1 t2 WHERE t1.user > t2.user AND t1.book = t2.book

将 table1 替换为您的实际表名

【讨论】:

  • 这是我的答案的精确副本..?
  • 确实如此。我的早了2分钟;但我猜这是常识。没有伤害,没有犯规;-)
  • @noirepyh 是的!可能是我当时正在输入答案,没有意识到。你想让我收回我的回答吗?
  • @FakhruddinUjjainwala 打扰一下,table1 t1, table1 t2 是什么?我猜table1 是我的表的名称,但是 t1,t2,它们是从哪里来的?它们是用于在执行查询时传递数据的虚拟表吗?谢谢
  • 那些是table alias 只需将table1 替换为您的表名
【解决方案2】:

在 MySQL 中,您将使用 join。假设 user 对于赠书是唯一的:

delete t
    from t join
         (select book, max(user) as maxuser
          from t
          group by book
         ) tt
         where t.book = tt.book and t.user < tt.maxuser;

【讨论】:

  • 对不起,我想 t 是我的桌子的名字,对吧?那么,tt 是什么?谢谢
【解决方案3】:

假设book, user 是唯一的:

DELETE t1 FROM `table` t1, `table` t2 WHERE t1.user > t2.user AND t1.book = t2.book

如果您想保留“最高”用户,请将 &gt; 更改为 &lt;

【讨论】:

    【解决方案4】:

    对 sagi 评论的简单更改可以帮助您轻松:

    DELETE FROM `YourTable`
            WHERE (`book`,`user`) NOT IN
                    (SELECT * FROM (SELECT `book`,MAX(`user`) as id from `YourTable` GROUP BY `book`) as temp)
    

    【讨论】:

      猜你喜欢
      • 2011-08-26
      • 2016-09-18
      • 1970-01-01
      • 2019-10-27
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 2022-07-19
      相关资源
      最近更新 更多