我有一个小的声明递减一个值:
UPDATE cart_items SET quantity = quantity - 1
WHERE cart_id = {$cart_id} AND id = {$cart_item_id}
Run Code Online (Sandbox Code Playgroud)
但是如果该值在减量后变为0,那么SQL是否可以删除该行?如果是这样,那么我想重新计算与该购物车匹配的行数:
SELECT FROM cart_items WHERE cart_id = {$cart_id}
Run Code Online (Sandbox Code Playgroud)
如果行数为零,我想从另一个表中删除该记录,如下所示:
DELETE FROM cart WHERE id = {$cart_id}
Run Code Online (Sandbox Code Playgroud)
目前看起来需要几个查询才能做到这一点,但是这一切都可以在一个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;
Run Code Online (Sandbox Code Playgroud)
最后一个DELETE将 cart 加入到 cart_items 中,如果没有找到则删除购物车(cart_items 字段为NULL)。
我已经包含了可用的标识符来加速DELETEs,尽管没有它们应该没问题。它只会查找并拾取任何其他数量为 0 的物品或空购物车。