0

我在详细说明 MySQL 查询时遇到了另一个问题。

我有两个数据库,每个数据库都有一个包含城市的数据库。我的客户从另一家公司获得了他的旧网站,我需要获取旧数据库城市和新数据库城市之间的相关性。

这是数据库的结构:

数据库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
);

所以我必须将条目从一个数据库转移到另一个,但问题是 old_entries.old_city_id 不会对应于新数据库中的正确城市,因为 id 不同。

我想得到我的 old_entries.* 加上一个字段(或直接替换 old_city_id),其中包含我通过邮政编码对应得到的 new_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

新城市样本

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

预期结果:

ID  |  OLD_CITY_ID  | NEW_CITY_ID
 1  |     23000     |   23500

或最终

ID |  CITY_ID
 1 |   23500

所以我们可以看到,如果我转移的entry保持它的city_id,就不再对应Paris,而是对应Marseille,所以我需要将entry.city_id中的23000替换为23500,也就是城市Paris的新id,由其邮政编码 (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 回答