gpt4 book ai didi

mysql - 如何从具有现有记录的表安全地创建一对多表?

转载 作者:行者123 更新时间:2023-11-29 09:27:32 25 4
gpt4 key购买 nike

我有一个包含 1000 条订单记录的表,一个订单可以有 1 个或多个产品,但是,所有数据都在单个表中。 (SQL Fiddle)

相反,订单数据应位于 orders 表中,并且该订单中的产品应位于映射表中

我现有的订单表

+-----------------+----------+--------------+
| 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 |
+-----------------+----------+--------------+

我要创建的新映射表

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查询将数据导入到映射表?

最佳答案

我个人会向 orders_prod_map 添加一个 quantity 列,以加快将来的查询速度(计算 COUNT(*) 一次,而不是每次选择)。您可以使用这些查询生成必要的数据。

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

订单中删除重复行:

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,以使结果更有用)

表格订单:

orders_auto_inc     order_id
1 333
2 334
5 337

orders_prod_map:

orders_auto_inc     quantity    product_code
1 1 abcd
2 1 not same product
2 2 same product
5 1 hij

Demo on dbfiddle

如果您不需要数量列,请将 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

Demo on dbfiddle

关于mysql - 如何从具有现有记录的表安全地创建一对多表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59321482/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com