INSERT ... SELECT语法问题来自两个或多个不同查询的值

时间:2013-08-23 18:20:09

标签: mysql sql

我有一个表名 shop_balance 。它有3列
shop_balance_id (INT,PK), shop_balance (DOUBLE), balance_date (DATE))。


对于 shop_balance (DOUBLE)列,我使用两个子查询 1.在 shop_balance 表中获取最后一个店铺余额金额 shop_balance 列。
2.购买一件产品后获得购买金额 最后我减去它们并获得当前的店铺余额

我的查询在这里

INSERT INTO shop_balance 
SELECT null,
(
    (SELECT shop_balance FROM shop_balance 
     WHERE 
     shop_balance_id=(SELECT MAX(shop_balance_id) FROM shop_balance)
    ) 
        -
    (
    SELECT 
        SUM(pr_pur_cost_price*quantity) AS net FROM product_purchase_item AS i
    LEFT JOIN 
        product_purchases AS p
    ON 
        p.product_purchase_item_id=i.product_purchase_item_id
    WHERE 
        p.insert_operation=$id
    GROUP by 
        p.insert_operation
    )
),curdate();

很明显,两个子查询是不同的条件,没有直接的关系。以上INSERT查询效果很好。但是,如果INSERT ... SELECT一个值没有INSERT语法,那么使用多个子查询是否是个好主意?如果没有,我如何转换为INSERT ... SELECT语法?

1 个答案:

答案 0 :(得分:1)

您必须按计算方式进行计算。我猜测触发器可能更好地满足您的需求,但在insert中执行逻辑很好。

以下内容略微简化了您的查询。它消除了shop_balance上的双子查询,将left join更改为内连接(第二个表上有条件),并从第二个子查询中删除group by

INSERT INTO shop_balance 
    SELECT null,
           ((SELECT shop_balance
             FROM shop_balance 
             ORDER BY shop_balance_id desc
             LIMIT 1
            ) -
            (SELECT SUM(pr_pur_cost_price*quantity) AS net
             FROM product_purchase_item i JOIN 
                  product_purchases p
                  ON p.product_purchase_item_id=i.product_purchase_item_id
             WHERE p.insert_operation=$id
           )
          ), curdate();

您还应列出insert子句中的列,并可能消除第一个NULL(默认情况下将设置为NULL)。最终curdate()表示您可能还希望自动列存储插入时间。