我想从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
修改
我看到这个questoin被标记为重复。但我认为它是独一无二的。与此相关的链接dulpicate。我看到这个链接,并且有一个标记为小尺寸表有用的答案,它在索引中进行更改并使其独特指数。这是
ALTER IGNORE TABLE jobs ADD UNIQUE INDEX idx_name (site_id, title, company );
如果你在此之后运行此查询,那么当你添加任何数据时,Mysql检查它是否已经存在(如果存在)它停止添加它。
我已经告诉过你,如果使用这个查询,那么我的表格会包含大量数据
我在我的表中添加了一个结果它检查了我的整个表格,其中大约有500000行,这使得它变得单一,这使得它变慢。如果这是10,那么这只是一个新记录,或者如果我想输入100000个新记录,那么你的想法是什么它太慢了。
我看到其他答案大多数都包含HAVING
类。它已经很慢了。
答案 0 :(得分:7)
您可以使用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 的每次出现都添加了相应的最大日期,并删除了添加最大日期不匹配的任何内容。
我认为你想保留最新记录。
请注意,像这样的大量删除有点令人担心,因为如果你弄错了,你可能会删除所有记录。
编辑 - 版本与您现在提供的表格一致。这将删除重复项,只留下第一个相同的(即对于谷歌,你只剩下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
答案 1 :(得分:0)
使用脚本语言,如perl或python
1)执行查询以加载每一行
2)计算应该唯一的所有字段的校验和。例如,如果名称和成本每个唯一应该只有一个条目,则计算此校验和。像md5这样的散列算法对于这个
来说是理想的3)将每个校验和存储为“id”或某种方式可以识别该行以便以后删除
4)有一个规则系统来解决允许一组非唯一记录中的哪一个
5)一旦查询处理完成并找到所有重复项,使用规则和id / checksums集生成SQL删除命令(或一组删除命令)
6)执行删除命令
7)改变你的数据库结构,以便有一个独特的约束来防止再次发生这种情况
数据库只有500 000行,因此存储id信息和校验和完全在大多数脚本语言的能力范围内