0

在我的 MySQL 表中,我有一个简单的邮政编码表,它是从 .xlsx 文件转换而来的。

Country   |City    |MiniDistrict |Postal Code
---------------------------------------------
Bulgaria  |Sofia   |Oborishte    | 0844
Bulgaria  |Sofia   |Sredets      | 0988
Bulgaria  |Plovdiv |Montana      | 1299
Bulgaria  |Plovdiv |Dyavol       | 1288
Bulgaria  |Varna   |Andeevo      | 1574
France    |Paris   |Mantois      |38992
France    |Paris   |Valois       |38764
France    |Gard    |Lussan       |55980

如您所见,国家和城市名称重复了无数次。另请注意,不同国家/地区的城市名称相同。我想编写一个 PHP 算法,在其中我将在 MySQL 中生成一个country 表、一个city 表和一个minidistrict-postalcode 表。国家表很简单,SELECT DISTINCT. 我应该为其他表写什么算法?算法的想法对我来说就足够了,不需要编码部分。

4

3 回答 3

2

尝试类似的东西

table_Country

Country_id | country_name
  1        |   Bulgaria  
  2        |   France    

table_City

City_id | Country_id | City_name 
   1    |  1         |   Sofia   
   2    |  1         |   Plovdiv 
   3    |  1         |   Andeevo   
   4    |  2         |   Paris   
   5    |  3         |   Gard    

table_MiniDistrict

MiniDistrict_id | City_id | MiniDistrict_Postal 
于 2012-11-17T17:48:22.040 回答
1

您不需要 PHP 来填充您的新表。

这是一个例子:

  1. 创建具有自动增量 ID 和名称字段的表
  2. 使用填充表

    INSERT INTO country_name (name) (SELECT DISTINCT country FROM your_current_table)

于 2012-11-17T17:51:52.013 回答
1

“算法”是这样的:你注意到每个 MiniDistrict 都有一个 PostalCode,每个 PostalCode 都有它的 MiniDistrict。所以你把它们放在一个表中,并将每一对与一个唯一的 ID 相关联。

CREATE TABLE district_postalcode
(
    id integer not null primary key auto_increment,
    minidistrict varchar(???),
    postalcode char(5)
);

然后您会注意到每个城市都是一个对象,国家/地区也是如此,因此您为它们创建了两个表,每个表都有自己的 ID。

现在,您必须存储 minidistricts 和 city 之间的关系。但这是多对一的关系:多个小区可能属于同一个城市,但同一个小区不能属于两个城市。

因此,您将引用添加为 minidistrictscities.id的外键。city_id

城市和国家之间的关系结构是相同的。所以你再次添加一个外键,这次country_idcountries.idinto cities

此时,您还可以VIEW像以前一样创建一个来查看您的数据:

CREATE VIEW old_style AS SELECT
    countries.Country,
    cities.City,
    districts.MiniDistrict,
    districts.PostalCode
FROM districts
    JOIN cities ON (cities.id = districts.city_id)
    JOIN countries ON (country.id = cities.country_id);

您还可以从没有外键的表开始填充您的新数据和districts现有数据:citiescountries

INSERT INTO countries ( Country ) SELECT DISTINCT Country FROM old_table;

INSERT INTO cities ( City, country_id )
    SELECT DISTINCT City, Country.id
    FROM old_table
    JOIN countries ON ( old_table.Country = countries.Country );

(如果一个城市在两个国家存在相同的名称,这将插入两次 - 每个国家 ID 一个 - 但这应该是:城市名称通常不是唯一的)。

于 2012-11-17T17:59:13.723 回答