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)
使用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)
| 归档时间: |
|
| 查看次数: |
1406 次 |
| 最近记录: |