【问题标题】:MySQL Split Single Row Values into Multiple InsertsMySQL 将单行值拆分为多个插入
【发布时间】:2015-02-28 09:19:27
【问题描述】:

这是我当前的订单销售表结构(简化):

id|order_id|fee1|fee2|fee3|fee4|fee5|fee6|fee7|fee8|total|created

这就是我希望它变成的样子:

交易:

id|order_id|total|created

交易费用:

id|transaction_id|fee|amount

我将如何获取原始订单销售记录,并将它们转移到这个新的 2 表结构中?

我知道 MySQL 的 INSERT...SELECT,这就是我目前所拥有的:

INSERT INTO transactions (order_id, total, created)
      SELECT order_id, total, created
      FROM order_sales

但我还需要获取 fee1...fee(n) 并将它们放入 transaction_fee 表中,最好在与 fee 表相同的查询中将交易主键作为外键,因此需要准确.

这样就变成了:

Transactions
1|123|50.00|2015-01-01 00:00:00

Transaction_fee
1|1|fee1|10.00
1|1|fee2|10.00
1|1|fee3|10.00
1|1|fee4|10.00
1|1|fee5|10.00

有什么想法吗?

【问题讨论】:

  • 将其描述为一个结构是对这个术语的过度使用。但我知道你要去哪里,这很好。
  • 您当前表中的“order_id”是否唯一?
  • @sn00k4h 这是一个合理的假设

标签: mysql database select insert


【解决方案1】:

我知道更改数据库的结构需要进行许多其他更改,并且在许多情况下可能需要做很多工作,但是我认为更改数据库的结构将使您的工作更具可扩展性和直接性。

例如,如果您想在未来添加一种新的费用,则需要添加一个新列并编辑许多现有查询,因此我建议将您的销售表拆分为 3 个相关表: 订单(OrderID,总计,创建日期)//不确定是否需要总计,可以通过查询选择我添加它以防万一

FeeType (Fee_ID, Fee_Title) //所有费用类型(fee1,fee2,..etc)都应该作为记录存储在这里

OrderFees(OrderID, Fees_ID, Amount) //这里我假设每次都加上支付的金额,如果没有你可以在FeeTypes表中做“Amount”。

现在,如果您想发送交易,如果您只是想保存订单的摘要,则可以是对 Orders 表的完整插入语句,否则如果您想发送有关每项费用的详细信息,您将向 OrderFees 发送插入查询包含 OrderID、FeeID 和应付金额的表。

【讨论】:

  • 我认为这就是 OP 想要做的。
【解决方案2】:

考虑以下...

DROP TABLE IF EXISTS transactions;

CREATE TABLE transactions
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,order_id INT NOT NULL
,fee1 DECIMAL(5,2) NOT NULL
,fee2 DECIMAL(5,2) NOT NULL
,fee3 DECIMAL(5,2) NOT NULL
,total DECIMAL(5,2) NOT NULL
,created DATETIME NOT NULL
);

INSERT INTO transactions VALUES 
(1,123,50.00,75.00,25.00,150.00,'2015-01-01 00:00:00'),
(2,125,10.00,25.00,15.00,50.00,'2015-01-02 00:00:00');


SELECT * FROM transactions;

+----+----------+-------+-------+-------+--------+---------------------+
| id | order_id | fee1  | fee2  | fee3  | total  | created             |
+----+----------+-------+-------+-------+--------+---------------------+
|  1 |      123 | 50.00 | 75.00 | 25.00 | 150.00 | 2015-01-01 00:00:00 |
|  2 |      125 | 10.00 | 25.00 | 15.00 |  50.00 | 2015-01-02 00:00:00 |
+----+----------+-------+-------+-------+--------+---------------------+

SELECT id
     , order_id
     , 1 fee_id
     , fee1 value
     , created 
  FROM transactions
 UNION
SELECT id
     , order_id
     , 2 
     , fee1 
     , created 
  FROM transactions
 UNION
SELECT id
     , order_id
     , 3 
     , fee1 
     , created 
  FROM transactions;
+----+----------+--------+-------+---------------------+
| id | order_id | fee_id | value | created             |
+----+----------+--------+-------+---------------------+
|  1 |      123 |      1 | 50.00 | 2015-01-01 00:00:00 |
|  2 |      125 |      1 | 10.00 | 2015-01-02 00:00:00 |
|  1 |      123 |      2 | 50.00 | 2015-01-01 00:00:00 |
|  2 |      125 |      2 | 10.00 | 2015-01-02 00:00:00 |
|  1 |      123 |      3 | 50.00 | 2015-01-01 00:00:00 |
|  2 |      125 |      3 | 10.00 | 2015-01-02 00:00:00 |
+----+----------+--------+-------+---------------------+


DROP TABLE IF EXISTS transactions_new;

CREATE TABLE transactions_new AS
SELECT id
     , order_id
     , 1 fee_id
     , fee1 value
     , created 
  FROM transactions
 UNION
SELECT id
     , order_id
     , 2 
     , fee1 
     , created 
  FROM transactions
 UNION
SELECT id
     , order_id
     , 3 
     , fee1 
     , created 
  FROM transactions;

ALTER TABLE transactions_new ADD PRIMARY KEY(id,order_id,fee_id);

SELECT * FROM transactions_new;
+----+----------+--------+-------+---------------------+
| id | order_id | fee_id | value | created             |
+----+----------+--------+-------+---------------------+
|  1 |      123 |      1 | 50.00 | 2015-01-01 00:00:00 |
|  1 |      123 |      2 | 50.00 | 2015-01-01 00:00:00 |
|  1 |      123 |      3 | 50.00 | 2015-01-01 00:00:00 |
|  2 |      125 |      1 | 10.00 | 2015-01-02 00:00:00 |
|  2 |      125 |      2 | 10.00 | 2015-01-02 00:00:00 |
|  2 |      125 |      3 | 10.00 | 2015-01-02 00:00:00 |
+----+----------+--------+-------+---------------------+

【讨论】:

  • 我了解created 列应保留在transactions
【解决方案3】:

如果 'order_id' 列是唯一的:

INSERT INTO Transaction_fee(transaction_id, fee, amount)
  SELECT t.id, 'fee1', o.fee1
  FROM Transactions t
    LEFT JOIN Order o USING(order_id) -- Assuming your current table is called 'Order'
  UNION ALL
  SELECT t.id, 'fee2', o.fee2
  FROM Transactions t
    LEFT JOIN Order o USING(order_id)
  UNION ALL
  ...

如果 order_id 不是唯一的,您仍然可以实现相同的方法,但使用现有订单表的“id”列。我要做的是,暂时将此“id”列作为新“事务”表的最后一列,使用它进行连接,并在完成将数据迁移到 Transactions_fee 表后,删除临时“事务”。 id' 列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 2021-01-24
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多