0

MySQL クエリの作成に関して別の問題があります。

2 つのデータベースがあり、それぞれに都市を含むデータベースがあります。私のクライアントは別の会社から古い Web サイトを取得しました。古いデータベースの都市と新しいデータベースの都市との相関関係を取得する必要があります。

データベースの構造は次のとおりです。

データベース1

CREATE TABLE new_cities (
 new_id INT PRIMARY KEY,
 new_postal_code INT,
 new_city_name VARCHAR(255)
);

データベース2

CREATE TABLE old_cities (
 old_id INT PRIMARY KEY,
 old_postal_code INT,
 old_city_name VARCHAR(255)
);

CREATE TABLE old_entries (
entry_id INT PRIMARY KEY,
city_id INT
);

したがって、データベースから別のデータベースにエントリを転送する必要がありますが、ID が異なるため、old_entries.old_city_id が新しいデータベースの正しい都市に対応しないという問題があります。

old_entries.* に加えて、郵便番号の対応によって取得した new_city_id を含むフィールド (または old_city_id を直接置き換える) を取得したいと考えています。

動作しない私の現在のクエリは次のとおりです。

SELECT *, 
(SELECT database1.new_cities.id FROM database1.new_cities, database2.old_entries WHERE  database1.new_cities.zipcode = 
(SELECT database2.old_cities.cp FROM database2.old_cities, database2.old_entries WHERE database2.old_entries.city_id = database2.old_cities.old_id)
) AS newcp FROM database2.old_entries WHERE 1

サブクエリが複数の行を返すという論理メッセージが表示されます。

構造は次のようにする必要があります。

1 - 私の old_entry を取る

2 - old_entry.city_id を取得し、old_cities テーブルから対応する郵便番号を取得します

3 - この郵便番号を取得し、この郵便番号に対応する new_cities.new_id を取得します

4 - この new_id を行 AS newcp に追加します (または、city_id の値を直接置き換えます)。

クエリで各行に対応する new_city_id AS newcp を取得するにはどうすればよいですか?

編集: サンプル

記入例:

ID| CITY_ID
1 | 23000

old_cities サンプル

ID    | ZIPCODE | NAME
23000 |  75000  | Paris

new_cities サンプル

ID    | ZIPCODE | NAME
23000 |  13000  | Marseille
23500 |  75000  | Paris

期待される結果:

ID  |  OLD_CITY_ID  | NEW_CITY_ID
 1  |     23000     |   23500

または最終的に

ID |  CITY_ID
 1 |   23500

転送されたエントリがその city_id を保持する場合、それはもはやパリではなくマルセイユに対応することがわかります。そのため、entry.city_id の 23000 を都市パリの新しい ID である 23500 に置き換える必要があります。郵便番号 (75000) で識別

4

1 に答える 1

1

対応する新しい都市 ID を取得するクエリは次のようになります。

SELECT database2.old_entries.entry_id AS id, database1.new_cities.new_id AS city_id
FROM database2.old_entries AS entries 
    JOIN database2.old_cities AS old_cities ON (entries.city_id = old_cities.old_id)
    JOIN database1.new_cities AS new_cities ON (old_cities.old_postal_code = new_cities.new_postal_code)

これにより、一致する新しい都市 ID を持つすべてのエントリ ID が返されます。JOINの仕組みも参照してください。

結果をテーブルに挿入する場合は、次のクエリを使用できます。

INSERT INTO new_entries (entry_id, city_id)
SELECT database2.old_entries.entry_id AS id, database1.new_cities.new_id AS city_id
FROM database2.old_entries AS entries 
    JOIN database2.old_cities AS old_cities ON (entries.city_id = old_cities.old_id)
    JOIN database1.new_cities AS new_cities ON (old_cities.old_postal_code = new_cities.new_postal_code)
于 2013-05-26T19:22:56.907 に答える