删除mysql数据库中的重复项

时间:2012-01-09 18:24:06

标签: mysql

我有一张包含纬度和经度列的表格。在大多数情况下,该值延伸超过小数点:-81.7770051972473在极少数情况下值如下:-81.77对于某些记录。

如何找到重复项并删除其中一个重复项,仅用于超出两位小数的记录?

3 个答案:

答案 0 :(得分:1)

不确定如何在SQL中完全执行此操作。

我使用PHP或CFML等脚本语言通过构建查询来拉取记录然后循环遍历记录集并执行一些比较来解决类似的需求。如果为true,则非常小心地调用另一个函数,传入记录ID并删除记录。我甚至可能将记录保留在表中,但将另一列标记为isDeleted。

如果你比我更有野心,看起来这个线程接近你想要的

Deleting Duplicates in MySQL

finding multi column duplicates mysql

答案 1 :(得分:1)

使用一些有创意的substringfloatcharindex逻辑,我想出了这个:

delete l1
from 
    latlong l1
    inner join (
        select
            id,
            substring(cast(latitude as varchar), 0, INSTR(CAST(latitude as varchar))+3, '.') as truncatedLat
        from
            latlong
    ) l2 on
        l1.id <> l2.id
        and l1.latitude = cast(l2.truncatedLat as float)

在开始使用之前,请先尝试select *代替delete l1以确保删除正确的行。

我应该注意到,这在SQL Server上使用我知道存在于MySQL中的函数,但我无法针对MySQL实例进行测试,因此可能需要进行一些调整。例如,在SQL Server中,我使用charindex而不是instr,但两者都应该相似。

答案 2 :(得分:1)

使用外部编程语言(Perl,PHP,Java,Assembly ...):

  • 从数据库中选择*
  • 对于每一行,从数据库中选择*,其中newLat&gt; = round(oldLat,2)和newLat&lt; round(oldLat,2)+ .01和//经度相同的标准
  • 根据您选择的标准保留其中一个。如果是最低主键,请按此排序并跳过第一个结果。
  • 删除其他所有内容。
  • 对已删除的所有记录重复跳至此步骤。

如果出于某种原因,您想要识别超过2位精度的所有内容:

select * from database where lat != round(lat,2), or long != round(long,2)