在我的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中生成一个国家表,一个城市表和一个 minidistrict-postalcode表。国家/地区表格很简单,SELECT DISTINCT
。我应该为其他表写什么algorythm? algorytm的想法对我来说已经足够了,不需要编码部分。
答案 0 :(得分: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
答案 1 :(得分:1)
您不需要PHP来填充新表。
以下是一个例子:
使用
填充表格INSERT INTO country_name(name)(从your_current_table中选择DISTINCT国家/地区)
答案 2 :(得分:1)
“算法”是这样的:你注意到每个MiniDistrict都有一个PostalCode,每个PostalCode都有它的MiniDistrict。因此,您将这些放在一个表中,并将每对与唯一ID相关联。
CREATE TABLE district_postalcode
(
id integer not null primary key auto_increment,
minidistrict varchar(???),
postalcode char(5)
);
然后您会注意到每个城市都是一个对象,而国家/地区也是如此,因此您为它们创建了两个表,每个表都有自己的ID。
现在你必须存储小区和城市之间的关系。但这是一种多对一的关系:许多小区可能属于同一个城市,但同一个小区不能属于两个城市。
因此,您将cities.id
的引用作为外键city_id
添加到小区。
城市和国家之间的关系结构是相同的。所以再次添加一个外键,这次country_id
到countries.id
添加到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
,cities
和countries
,从没有外键的表开始:
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 );
(如果两个国家/地区的名称相同,则会插入两次城市 - 每个国家/地区都有一个 - 但应该是这样:城市名称通常不是唯一的。)