0

我有 2 个mysql表:

地点

  • id_location
  • 城市

location_geo

  • ip_start
  • ip_end
  • id_location

问题是位置表中至少有1/4的城市是重复记录。我可以轻松地运行此查询并删除那些重复的记录:

ALTER IGNORE TABLE location ADD UNIQUE INDEX idx (city);

此之前,我还必须使用唯一的城市 ID 更新 location_geo 表。例如,这是一种可能性:

地点

  • 129,洛杉矶
  • 145,纽约
  • 176,洛杉矶
  • 856,洛杉矶

location_geo

  • 16778240, 16778751, 129
  • 16817792, 16819711, 176
  • 16820992、16822527、129
  • 16827904、16828415、856
  • 16829440, 16832511, 145
  • 16832512, 16832639, 129

location_geo中的 id_location 字段应更新为位置表中的第一个可用 ID,以便示例中的结果应显示:

  • 16778240, 16778751, 129
  • 16817792, 16819711, 129
  • 16820992、16822527、129
  • 16827904、16828415、129
  • 16829440, 16832511, 145
  • 16832512, 16832639, 129

顺便说一句, location_geo表中有 2,021,182 条记录。

任何帮助将不胜感激。

4

1 回答 1

1

我会分三个步骤来做这件事。您没有指定您的 RDBMS 类型,因此这是非常通用的语法。

为新创建一个映射表location_id

create table new_loc_map as
select a.id_location as old_loc
       a.city
     , b.id_location
from location a
join (
   select city
        , min(id_location) as id_location
   from location
   group by city
   ) b
on a.city=b.city

更新location_geo表格:

update location_geo
from new_loc_map
set location_geo.id_location=new_loc_map.id_location
where location_geo.id_location=new_loc_map.old_loc

创建一个新location表:

create table new_location as
(select distinct id_location
      , city
 from new_loc_map
 )
unique index idx (location)

您的问题描述了在您的表上创建一个新的复合索引location以删除重复项,但除非我不完全理解,否则您只需要在location_id.

于 2013-09-08T17:34:21.887 回答