从Mysql表中删除重复行并仅保留一行

Axe*_*eem 1 mysql

我想从Mysql表中删除所有重复的行.
但问题是我不知道哪些行是重复的.
这个Mysql表包含一个大约500000行的大数据.
其中一些行是重复的.
请指导我如何做到这一点.

更新:

我需要在phpMyAdmin中运行的SQL查询.
这是一个粗略的表格来理解.
假设表名是foo.

+---------------------------------------------------------------------+
| id |   link  |     title              |  description                |
+---------------------------------------------------------------------+
| 1  |  google |     search engine      |  search here free           |  
| 2  |  yahoo  |    also search engine  | findout web easily          |  
| 3  | Facebook|  connect with world    | meet with world             |  
| 4  | google  |  search engine         |  search here free           |
| 5  | msn     | Microsoft network      | network by MS               |
| 6  | google  | search engine          |  search here free           |
| 7  | msn     | Microsoft network      | network by MS               |
| 8  | yahoo   |  also search engine    | findout web easily          |
| 9  | myweb   |  my website            | ideal website               |
|... | ....    | .....continue....      | ..... ... .....             |
+---------------------------------------------------------------------+   
Run Code Online (Sandbox Code Playgroud)

这是一个粗糙的表我无法完全定义我的表,因为它有大约500000
行.希望这能理解你想要的东西.
我这样粗略查询.

DELECT all duplicate rows FROM foo
Run Code Online (Sandbox Code Playgroud)

编辑
我看到这个questoin标记为重复.但我认为它是独一无二的.你用这个链接比较它dulpicate.I看到这个链接,并且有一个标记为小尺寸表有用的答案它会改变索引和制作独特的指数.这是代码

  ALTER IGNORE TABLE jobs ADD UNIQUE INDEX idx_name (site_id, title, company );  
Run Code Online (Sandbox Code Playgroud)

如果你在此之后运行此查询,当你添加任何数据时,Mysql检查它是否已经存在(如果存在)它停止添加它.
我已经告诉过你,如果使用这个查询,我的表正在处理一个大数据,之后我在我的表中添加了一个结果,检查我的整个表,在哪一轮大约有500000行,这使得它变得单一,这使得它变慢.它只有一个新记录,如果这是10或你的想法,如果我想输入100000新记录,它会慢得多.
我看到其他答案大多数都包含类HAVING.它已经很慢了.

Kic*_*art 7

你可以在DELETE中使用JOIN来实现它,加入subselect.

需要更多细节才能提供很多帮助,但是对于一个粗略的想法: -

DELETE result 
FROM result
INNER JOIN (SELECT SomeField, COUNT(*) AS RecCount, MAX(DateAddded) AS MaxDateAdded FROM result GROUP BY SomeField) b
ON result.SomeField = b.SomeField AND a.DateAdded != b.MaxDateAdded
Run Code Online (Sandbox Code Playgroud)

这是发现SomeField的每个出现都添加了相应的最大日期,并删除了添加的最大日期没有匹配的任何地方.

我假设您想保留最新记录.

请注意,像这样的批量删除有点令人担忧,因为如果你弄错了,你可能会删除所有记录.

编辑 - 版本与您现在提供的表格一致.这将删除重复项,只留下第一个相同的副本(例如,对于Google,您只剩下ID为1的行)

DELETE foo 
FROM foo
INNER JOIN (SELECT link, title, description, MIN(id) AS MinId FROM foo GROUP BY link, title, description ) b
ON foo.link = b.link
AND foo.title = b.title 
AND foo.description = b.description
AND foo.id != b.MinId
Run Code Online (Sandbox Code Playgroud)

  • 我也通过在嵌套选择上添加HAVING子句来加速此查询,因此INNER JOIN变为(SELECT链接,标题,描述,MIN(id)AS MinId FROM foo GROUP BY链接,标题,描述**具有计数(*)> 1**)因此从内部联接中删除所有非重复项,而不必在内部联接中处理它们 (2认同)