mysql - 从 Mysql 表中删除重复行并只保留一行

标签 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....      | ..... ... .....             |
+---------------------------------------------------------------------+   

这是一张粗略的表格,我无法完全定义我的表格,因为它大约有 500000
行。希望这能理解你我想要的。
我这样粗略地查询。

DELECT all duplicate rows FROM foo

编辑
我看到这个问题被标记为重复。但我认为它是唯一的。与此链接你比较它 dulpicate。我看到这个链接,有一个答案被标记为对小尺寸表有用,它改变索引并使唯一指数。这是它的代码

  ALTER IGNORE TABLE jobs ADD UNIQUE INDEX idx_name (site_id, title, company );  

如果你在这之后运行这个查询,当你添加任何数据时,Mysql 检查它是否已经存在,如果存在,它会停止添加这个。
我已经告诉过你,如果使用这个查询和之后,我的表包含大量数据 我在我的表中添加一个结果,它检查我的整个表,其中大约 500000 行以使其具有唯一性,这使它变慢。如果这是 10,那么它只是一个新记录,或者如果我想输入 100000 条新记录,你的想法是什么它让它变得太慢了。
我看到其他答案大部分都包含 HAVING 类。它已经很慢了。

最佳答案

您可能可以在 DELETE 中使用 JOIN 来完成此操作,并针对子选择进行连接。

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

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

这是查找 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

关于mysql - 从 Mysql 表中删除重复行并只保留一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16030470/

相关文章:

php - 在文本字段中搜索日期范围

mysql - 需要具体的 SQL 查询优化帮助

mysql - 删除 JSON 键中的前导和尾随空格

php - 多个管理员的 Codeigniter 角色

mysql - 使用 LIKE 连接表时加快 Mysql UPDATE

php - 在 MySQL 中获取给定月份的记录?

mysql - 索引如何降低 MySQL 性能?

PHP 表单产品和类别

mysql - 为什么这个 SQL 字符串不起作用?

mysql - 像维基百科一样在 div 中创建 div