我有一个很小的声明,它会减少一个值:
UPDATE cart_items SET quantity = quantity - 1
WHERE cart_id = {$cart_id} AND id = {$cart_item_id}
但是,如果递减后该值变为0,SQL是否可以删除该行?如果是这样,那么我想重新计算与该购物车匹配的行数:
SELECT FROM cart_items WHERE cart_id = {$cart_id}
如果行数为零,我想从另一个表中删除该记录,如下所示:
DELETE FROM cart WHERE id = {$cart_id}
目前似乎需要几个查询才能执行此操作,但是是否可以在单个SQL语句中完成所有操作?
简短的答案是,如果不将额外的查询包装在触发器或过程中,则是不可能的。
您可以在事务中完成此操作,而无需使用SELECT
,但是它将需要3个查询:
START TRANSACTION;
UPDATE cart_items
SET quantity = quantity - 1
WHERE cart_id = {$cart_id}
AND id = {$cart_item_id};
DELETE
FROM cart_items
WHERE quantity = 0
AND cart_id = {$cart_id}
AND id = {$cart_item_id};
DELETE c
FROM cart c
LEFT JOIN cart_items ci
ON ci.cart_id = c.id
WHERE c.id = {$cart_id}
AND ci.cart_id IS NULL;
COMMIT;
最后一个DELETE
将购物车加入cart_items,如果找不到购物车,则将其删除(cart_items字段为NULL
)。
我已经包含了可用的标识符以加快DELETE
s的速度,尽管没有它们也应该没问题..它只会寻找并捡起其他数量为0的物品或空购物车。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句