【问题标题】:Delete partially similar rows in MySQL删除 MySQL 中部分相似的行
【发布时间】:2012-07-18 10:49:12
【问题描述】:

我需要使用 MySQL 删除表中部分相似的行。例如:

来自table1(id,color1,color2,key)的内容:

id,color1,color2,key
-----------------------------
1,Blue,Green,AASDDD
2,Blue,Green,JJUUYYY
3,Blue,Red,HHYYY
4,Green,Red,KKIII
5,Blue,Red,KKIIUUUU

我想删除color1,color2中的重复行并得到:

id,color1,color2,key
-----------------------------
1,Blue,Green,AASDDD
3,Blue,Red,HHYYY
4,Green,Red,KKIII

类似

delete FROM table1 WHERE Exists(SELECT color1,color2 FROM table1)

在不创建临时表的情况下,在 MySQL 中执行此操作的最佳方法是什么?

(我知道有很多关于删除 MySQL 中重复行的帖子,但不是针对部分匹配的行。)

【问题讨论】:

    标签: mysql sql


    【解决方案1】:
    DELETE FROM table1 
    WHERE id NOT IN (SELECT min(id) 
                     FROM table1 
                     GROUP BY color1, color2)
    

    编辑

    MySQL 无法从具有同一表的子查询的表中删除。要解决该限制,您可以这样做:

    DELETE FROM table1 
    WHERE id NOT IN (select * from (SELECT min(id) 
                                   FROM table1 
                                   GROUP BY color1, color2) t)
    

    【讨论】:

    • 感谢您的回复。我的问题是针对 MySQL 的,根据您的查询,您会得到:[Err] 1093 - You can't specify target table 'verbal_sets' for update in FROM 子句
    • 您可以使用临时表来存储子查询,然后从 table1 中删除所有不在临时表中的条目。
    • 这正是我想要避免的。该表很大并且索引很重。在 MySQL 中必须有一种方法可以做到这一点。我让它在 SQLite 下完美运行。
    • 我相信这一定不是最有效的方法,但它确实有效。谢谢!
    • @MiguelE:很抱歉我想不出更好的解决方案。您可以使用临时表,但这会更慢。
    【解决方案2】:
    DELETE FROM table1 WHERE id NOT IN (SELECT min(id) FROM table1 GROUP BY color1, color2)
    

    这里有 GROUP BY 的手册: http://dev.mysql.com/doc/refman/5.0/en/group-by-functions-and-modifiers.html

    教程:

    注意:

    在 MySQL 中:

    目前,您无法从表中删除并从中选择 子查询中的表。

    至少对于 5.0 版本。 (http://dev.mysql.com/doc/refman/5.0/en/delete.html)

    所以在mysql中你可以在transaction中使用TEMPORARY TABLE

    BEGIN;
    CREATE TEMPORARY TABLE colors_temp SELECT min(id) as id FROM table1 GROUP BY color1, color2;
    DELETE FROM table1 WHERE id NOT IN (SELECT id FROM colors_temp);
    DROP TABLE colors_temp;
    COMMIT;
    

    【讨论】:

    • 嗨。在 MySQL 中,您将通过此查询得到:[Err] 1093 - You can't specify target table 'verbal_sets' for update in FROM 子句
    • 您的查询在 SQLite 或 SQL Server 下工作,但在 MySQL 下有此限制。你可以找到很多关于这个的帖子,但我正在寻找一个干净的例子来清理部分重复。
    【解决方案3】:
       DELETE FROM table1 
       WHERE id NOT IN (SELECT MIN(id) FROM table1 GROUP BY colo1, color2)
    

    【讨论】:

      猜你喜欢
      • 2018-10-03
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-10
      • 1970-01-01
      • 2014-03-18
      相关资源
      最近更新 更多