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

ご覧のとおり、国と都市の名前は何度も繰り返されています。また、さまざまな国に同じ都市名があることにも注意してください。国のテーブル都市のテーブル、およびminidistrict-postalcodeテーブルをMySQLに生成するPHPアルゴリズムを作成したいと思います。カントリーテーブルは簡単ですSELECT DISTINCT。他のテーブルにはどのようなアルゴリズムを書く必要がありますか?algorytmのアイデアで十分であり、コーディング部分は必要ありません。

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があることに気づきます。したがって、これらを1つのテーブルにまとめ、各ペアを一意のIDに関連付けます。

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

次に、各都市が単一のオブジェクトであり、国でも同じであることに気付きます。そのため、それぞれが独自のIDを持つ2つのテーブルを作成します。

ここで、ミニディストリクトと都市の間の関係を保存する必要があります。しかし、これは多対1の関係です。多くのミニディストリクトは同じ都市に属している可能性がありますが、同じミニディストリクトが2つの都市に属することはできません。

したがって、ミニディストリクトへcities.idの外部キーとしてへの参照を追加します。city_id

関係構造は都市と国の間​​で同じです。したがって、ここでも外部キーを追加します。今回country_idcountries.idcities

その時点で、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 );

(これにより、2つの国に同じ名前で存在する都市が2回挿入されます(1つは各国IDを持ちます)が、それは当然のことです。都市名は通常一意ではありません)。

于 2012-11-17T17:59:13.723 に答える