删除所有非重复行但保留一个

delete all non-duplicate rows but keep one

在MySQL中,我有一个像这样的table

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 的行,并在末尾随机只保留其中一个。

所以table会变成

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

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

谢谢

在 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;

假设 book, user 是唯一的:

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

如果您想保留 "highest" 用户,请将 > 更改为 <

给你:

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

用您的 table 真实姓名替换 table1

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

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