我在将旧表分成大约100 k的记录时遇到了一些麻烦。表用于从电子商务应用程序收集订单。每个订单都作为新行添加到表中。
表名为" customer_informations"像这样描述:
+-------+-----------------------+------------+---------------------+---------------------+----------------+
| id | customer_phone_number | first_name | last_name | address | order_number |
+-------+-----------------------+------------+---------------------+---------------------+----------------+
如上所述,每一行都是一个单独的订单。有很多回头客。我正在重建结构,所以我根据customer_phone_number选择了不同的行,并将结果插入到test_informations中,如下所示:
+------+---------------------+------------+-----------+-------------+
| id | created_at | first_name | last_name | phone |
+------+---------------------+------------+-----------+-------------+
此表代表客户帐户。 Id字段的值从原始表复制。现在,我想收集客户在customer_informations表中的所有地址。
包含客户地址的表格如下所示:
+----+----------+----------+------+-------+-----+-------------------------+
| id | address1 | address2 | city | state | zip | customer_information_id |
+----+----------+----------+------+-------+-----+-------------------------+
这就是我的问题所在。我想从customer_information表中选择所有不同的地址,并将它们连接到我的test_informations表(通过customer_information_id外键)。我怎么处理这个?
我尝试了以下声明:
INSERT INTO `la`.`test_addresses`
(
`created_at`,
`address1`,
`address2`,
`city`,
`zip`,
`state`,
`customer_information_id`)
Select
STR_TO_DATE(order_placed, '%m/%d/%y %T') AS created_at,
`address`,
'',
`city_state_zip`,
`zip`,
`state`,
IF( EXISTS( SELECT `id` FROM `test_informations` WHERE `customer_info`.`id` = `test_informations`.`id`),
`customer_info`.`id`,
(SELECT `test_informations`.`id` FROM `test_informations` WHERE `test_informations`.`phone` = `customer_info`.`customer_phone_number`))
as customer_information_id
From `customer_info` group by `address`
所以我处理旧表中的每一行。如果当前行的id在我的temp_informations中,我只需添加此地址,并将外键设置为temp_informations条目的id。如果当前处理的行i的id不在test_informations中,则表示它必须是替代地址,我需要将其连接到该帐户。底线是,错误条件使整个查询进入无穷大。
我没有必要寻找这个问题的确切答案(尽管它会很好)。你们可以指出我正确的方向,我应该在哪里寻找答案,我应该研究MySql的哪些功能,或者有关如何有效地拆分这样的表的一些信息?
编辑:
可视化的表格不是实际表格的精确副本(它们有更多字段,但为简单起见,我包含了最重要的字段)。
答案 0 :(得分:0)
为什么要使用两个表(test_informations和另一个表用于地址数据)?我认为将所有数据放在一个表格中会更好,除非一个用户有很多城市,州,邮政编码...
使用一对一关系并不是那么糟糕,但是在这里我们有两个表用于同一个实体,我认为你使用的方法并不是那么好。所以,只需将它合并,然后您就不必通过外键来实现它。
如果您有一些可能导致问题的属性,您可以单独对它们进行标准化。
另外,请注意相同输入的不同变体,例如清洁' - ',' /'验证前电话号码中的空格字符和空格字符。