0

我有一个表名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语法?

4

1 回答 1

1

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

以下内容稍微简化了您的查询。它消除了 上的双子查询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()建议您可能还需要一个自动列来存储插入时间。

于 2013-08-23T18:38:02.970 回答