Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL将单行值拆分为多个插入_Mysql_Database_Select_Insert - Fatal编程技术网

MySQL将单行值拆分为多个插入

MySQL将单行值拆分为多个插入,mysql,database,select,insert,Mysql,Database,Select,Insert,以下是我当前的订单销售表结构(简化): 以下是我希望它成为的: 交易: id|order_id|total|created 交易费用: id|transaction_id|fee|amount 我将如何着手处理原始订单销售记录,并将它们移到这个新的2表结构中 我知道INSERT…SELECT for MySQL,这就是我目前所知道的: INSERT INTO transactions (order_id, total, created) SELECT order_id, tota

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

以下是我希望它成为的:

交易:

id|order_id|total|created
交易费用:

id|transaction_id|fee|amount
我将如何着手处理原始订单销售记录,并将它们移到这个新的2表结构中

我知道INSERT…SELECT for MySQL,这就是我目前所知道的:

INSERT INTO transactions (order_id, total, created)
      SELECT order_id, total, created
      FROM order_sales
但是我还需要抓取fee1…fee(n)并将它们放入transaction_fee表中,最好是在相同的查询中,因为fee表将transactions主键作为外键,因此需要准确

因此,它变成:

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

有什么想法吗?

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

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

FeeType(Fee\u ID、Fee\u Title)//所有费用类型(fee1、fee2等)都应作为记录存储在此处

OrderFees(OrderID,Fees\u ID,Amount)//这里我假设每次都会添加已支付的金额,如果不是,您可以在FeeTypes表中生成“Amount”


现在,如果您想发送一个事务,如果您只想保存订单摘要,则可以向Orders表发送一个完整的insert语句;否则,如果您想发送关于每项费用的详细信息,则将向OrderFees表发送insert查询,其中包含OrderID、FeeID和到期金额

考虑以下几点

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

如果“订单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不是唯一的,您仍然可以使用现有order表的“id”列实现相同的方法。我要做的是,暂时将此“id”列作为新“Transactions”表的最后一列,使用它进行联接,并在完成将数据迁移到Transactions\u费用表后,删除临时的“Transactions.id”列。

将其描述为一种结构是对该术语的过度使用。但是我看到了你的方向,这很好。你当前表中的“order\u id”是唯一的吗?@sn00k4h这是一个合理的假设。我认为OP正试图这样做。我理解创建的
列应该保留在
事务中。
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
  ...