如何使用现有记录从 table 安全地创建一对多 table?
How to safely create one-to-many tables from a table with existing records?
我有一个table有1000条订单记录,一个订单可以有1个或多个产品,但是,所有数据都是单一的table。 (SQL Fiddle)
相反,订单数据应在 orders
table 中,该订单中的产品应在映射 table
中
我现有 table 个订单
+-----------------+----------+--------------+
| orders_auto_inc | order_id | product_code |
+-----------------+----------+--------------+
| 1 | 333 | abcd |
| 2 | 334 | same product |
| 3 | 334 | same product |
| 4 | 334 | same product |
| 5 | 337 | hij |
+-----------------+----------+--------------+
新映射table我要创建
CREATE TABLE orders_prod_map (
orders_auto_inc int(10),
product_code varchar(100)
);
我希望最后的 table 看起来像这样
mysql> SELECT * FROM orders;
+-----------------+----------+
| orders_auto_inc | order_id |
+-----------------+----------+
| 1 | 333 |
| 2 | 334 |
| 5 | 337 |
+-----------------+----------+
mysql> SELECT * FROM orders_prod_map;
+-----------------+--------------+
| orders_auto_inc | product_code |
+-----------------+--------------+
| 5 | hij |
| 1 | abcd |
| 2 | same product |
| 2 | same product |
| 2 | same product |
+-----------------+--------------+
我可以写一个 Python 脚本来做到这一点,但是无论如何只能使用 MySQL 查询将数据导入映射 table?
就我个人而言,我会在 orders_prod_map
中添加一个 quantity
列以加快将来的查询速度(计算一次 COUNT(*)
而不是每次 SELECT
)。您可以使用这些查询生成必要的数据。
Create `orders_prod_map`:
INSERT INTO orders_prod_map
SELECT m.orders_auto_inc, COUNT(*), o.product_code
FROM orders o
JOIN (SELECT order_id, MIN(orders_auto_inc) AS orders_auto_inc
FROM orders
GROUP BY order_id) m ON m.order_id = o.order_id
GROUP BY o.order_id, o.product_code
删除 orders
中的重复行:
DELETE o1
FROM orders o1
JOIN orders o2 ON o2.order_id = o1.order_id
AND o2.orders_auto_inc < o1.orders_auto_inc
并从 orders
中删除 product_code
列:
ALTER TABLE orders DROP COLUMN product_code
然后您可以 SELECT *
来自每个结果表(请注意,我稍微修改了数据以将不同的产品添加到订单 334 以使结果更有用)
Table orders
:
orders_auto_inc order_id
1 333
2 334
5 337
Table orders_prod_map
:
orders_auto_inc quantity product_code
1 1 abcd
2 1 not same product
2 2 same product
5 1 hij
如果您不需要数量列,请将 INSERT
查询更改为:
INSERT INTO orders_prod_map
SELECT m.orders_auto_inc, o.product_code
FROM orders o
JOIN (SELECT order_id, MIN(orders_auto_inc) AS orders_auto_inc
FROM orders
GROUP BY order_id) m ON m.order_id = o.order_id
ORDER BY o.order_id, product_code
那么orders_prod_map
的内容是:
orders_auto_inc product_code
1 abcd
2 not same product
2 same product
2 same product
5 hij
我有一个table有1000条订单记录,一个订单可以有1个或多个产品,但是,所有数据都是单一的table。 (SQL Fiddle)
相反,订单数据应在 orders
table 中,该订单中的产品应在映射 table
我现有 table 个订单
+-----------------+----------+--------------+
| orders_auto_inc | order_id | product_code |
+-----------------+----------+--------------+
| 1 | 333 | abcd |
| 2 | 334 | same product |
| 3 | 334 | same product |
| 4 | 334 | same product |
| 5 | 337 | hij |
+-----------------+----------+--------------+
新映射table我要创建
CREATE TABLE orders_prod_map (
orders_auto_inc int(10),
product_code varchar(100)
);
我希望最后的 table 看起来像这样
mysql> SELECT * FROM orders;
+-----------------+----------+
| orders_auto_inc | order_id |
+-----------------+----------+
| 1 | 333 |
| 2 | 334 |
| 5 | 337 |
+-----------------+----------+
mysql> SELECT * FROM orders_prod_map;
+-----------------+--------------+
| orders_auto_inc | product_code |
+-----------------+--------------+
| 5 | hij |
| 1 | abcd |
| 2 | same product |
| 2 | same product |
| 2 | same product |
+-----------------+--------------+
我可以写一个 Python 脚本来做到这一点,但是无论如何只能使用 MySQL 查询将数据导入映射 table?
就我个人而言,我会在 orders_prod_map
中添加一个 quantity
列以加快将来的查询速度(计算一次 COUNT(*)
而不是每次 SELECT
)。您可以使用这些查询生成必要的数据。
Create `orders_prod_map`:
INSERT INTO orders_prod_map
SELECT m.orders_auto_inc, COUNT(*), o.product_code
FROM orders o
JOIN (SELECT order_id, MIN(orders_auto_inc) AS orders_auto_inc
FROM orders
GROUP BY order_id) m ON m.order_id = o.order_id
GROUP BY o.order_id, o.product_code
删除 orders
中的重复行:
DELETE o1
FROM orders o1
JOIN orders o2 ON o2.order_id = o1.order_id
AND o2.orders_auto_inc < o1.orders_auto_inc
并从 orders
中删除 product_code
列:
ALTER TABLE orders DROP COLUMN product_code
然后您可以 SELECT *
来自每个结果表(请注意,我稍微修改了数据以将不同的产品添加到订单 334 以使结果更有用)
Table orders
:
orders_auto_inc order_id
1 333
2 334
5 337
Table orders_prod_map
:
orders_auto_inc quantity product_code
1 1 abcd
2 1 not same product
2 2 same product
5 1 hij
如果您不需要数量列,请将 INSERT
查询更改为:
INSERT INTO orders_prod_map
SELECT m.orders_auto_inc, o.product_code
FROM orders o
JOIN (SELECT order_id, MIN(orders_auto_inc) AS orders_auto_inc
FROM orders
GROUP BY order_id) m ON m.order_id = o.order_id
ORDER BY o.order_id, product_code
那么orders_prod_map
的内容是:
orders_auto_inc product_code
1 abcd
2 not same product
2 same product
2 same product
5 hij