使用一个SQL查询进行SELECT,UPDATE,DELETE?

dan*_*mix 5 mysql sql

我有一个小的声明递减一个值:

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语句中完成吗?

Art*_*rth 2

简短的回答是,如果不将额外的查询包装在触发器或过程中,这是不可能的。

您可以在事务中执行此操作,并且无需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 的物品或空购物车。