从表中删除所有重复行的最有效方法是什么?

And*_*gin 8 mysql duplicate-removal delete-row

我有一张桌子:

| foo | bar |
+-----+-----+
| a   | abc |
| b   | def |
| c   | ghi |
| d   | jkl |
| a   | mno |
| e   | pqr |
| c   | stu |
| f   | vwx |
Run Code Online (Sandbox Code Playgroud)

我想按列删除包含重复项的所有行,foo以便表格看起来像这样:

| foo | bar |
+-----+-----+
| b   | def |
| d   | jkl |
| e   | pqr |
| f   | vwx |
Run Code Online (Sandbox Code Playgroud)

什么是最有效的方式做到这一点?

Joh*_*Woo 10

您可以从子查询加入表,该子查询仅返回唯一的foo使用LEFT JOIN.例如,将根据需要删除子查询上没有匹配的行

DELETE  a
FROM    TableName a
        LEFT JOIN
        (
            SELECT  foo
            FROM    TableName
            GROUP   BY Foo
            HAVING  COUNT(*) = 1
        ) b ON a.Foo = b.Foo
WHERE   b.Foo IS NULL
Run Code Online (Sandbox Code Playgroud)

要获得更快的性能,请在列上添加索引Foo.

ALTER TABLE tableName ADD INDEX(foo)
Run Code Online (Sandbox Code Playgroud)


OMG*_*ies 8

使用EXISTS:

DELETE a
  FROM TableName a
 WHERE EXISTS (SELECT NULL
                 FROM TableName b
                WHERE b.foo = a.foo
             GROUP BY b.foo
               HAVING COUNT(*) > 1)
Run Code Online (Sandbox Code Playgroud)

使用IN:

DELETE a
  FROM TableName a
 WHERE a.foo IN (SELECT b.foo
                   FROM TableName b
               GROUP BY b.foo
                 HAVING COUNT(*) > 1)
Run Code Online (Sandbox Code Playgroud)