我有一个表名 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
语法?
答案 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()
表示您可能还希望自动列存储插入时间。