我是一名网络开发人员,因此缺乏处理海量数据的知识。
一位同事正在寻找解决我们数据问题的方法。我们有一个大约 400k 行的表,其中列出了公司名称。
设计这个的人没有意识到公司需要某种唯一标识符,因此公司名称存在重复条目。
使用什么方法可以根据公司名称匹配所有这些记录,并根据某种标准删除重复项(另一列)
我正在考虑在 php 中编写一个脚本来执行此操作,但我真的很难相信我的脚本能够在这么多行之间进行比较时执行。有什么建议吗?
我是一名网络开发人员,因此缺乏处理海量数据的知识。
一位同事正在寻找解决我们数据问题的方法。我们有一个大约 400k 行的表,其中列出了公司名称。
设计这个的人没有意识到公司需要某种唯一标识符,因此公司名称存在重复条目。
使用什么方法可以根据公司名称匹配所有这些记录,并根据某种标准删除重复项(另一列)
我正在考虑在 php 中编写一个脚本来执行此操作,但我真的很难相信我的脚本能够在这么多行之间进行比较时执行。有什么建议吗?
答案: 答案来源
1)从表1中删除
2)使用table1,table1作为vtable
3) WHERE (不是 table1.ID>vtable.ID)
4) AND (table1.field_name=vtable.field_name)
- 这里你告诉mysql有一个table1。
- 然后你告诉它你将使用 table1 和一个带有 table1 值的虚拟表。
- 这将让 mysql 不与自己比较记录!
- 在这里你告诉它不应该有具有相同字段名的记录。
我过去这样做的方法是编写一个只返回我想要的集合的查询(通常使用 DISTINCT + 一个子查询来根据其他值确定正确的记录),并将其插入到不同的表中。然后,您可以删除旧表并将新表重命名为旧名称。
要在表中查找具有重复项的公司列表,您可以使用如下脚本:
SELECT NAME
FROM companies
GROUP BY NAME
HAVING COUNT(*) > 1
以下将删除所有重复项,但在 col 列中包含最大值除外
DELETE del
FROM companies AS del
INNER JOIN (
SELECT NAME, MAX(col) AS col
FROM companies
GROUP BY NAME
HAVING COUNT(*) > 1
) AS sub
ON del.NAME = sub.NAME AND del.col <> sub.col