繁体   English   中英

如果在 MySQL 中满足条件,则同时执行 SELECT 和 UPDATE

[英]Doing a SELECT and UPDATE simultaneously IF a condition is met in MySQL

我正在尝试建立一个结帐系统。 我有 3 张桌子,一张用来存放产品,一张用来存放用户的购物车,一张用来存放已完成的订单。

产品

product_id  |  product_name  | stock  |  unit_price
1           |  item1         | 10     |  40
2           |  item2         | 5      |  30
3           |  item3         | 4      |  29

大车

user_id  |  product_id  |  quantity
1        |  1           |  4
1        |  2           |  6

完成的订单

user_id  |  product_id  |  quantity
1        |  3           |  2

我想要做的是在 PRODUCTS 中做一个 SELECT 并检查库存是否大于用户购物车中的数量。 如果这是真的,那么它会直接在 MYSQL 查询中减少 Stock 计数。

现在我遇到的问题是,我不知道这是否可能。 我可以在 PHP 中完成,但需要多次迭代,我想避免这种情况,以防它不是太优化。

我四处搜索,在这里找到了一个部分解决方案: MySQL - SELECT then UPDATE

但是,我不知道如何在其中包含 IF。

这可以在 MySQL8 中的一个查询中完成,使用CTE计算是否可以满足购物车中的所有库存,然后仅在满足以下条件时才更新products

WITH cart_balance_ok AS (
  SELECT c.user_id, 
         MIN(p.stock >= c.quantity) AS cart_ok
  FROM cart c 
  JOIN products p ON p.product_id = c.product_id
  GROUP BY c.user_id
)
UPDATE products p
JOIN cart c ON c.product_id = p.product_id
JOIN cart_balance_ok cb ON cb.user_id = c.user_id AND cb.cart_ok = 1
SET p.stock = p.stock - c.quantity

演示显示没有变化,因为这里没有足够的库存。 演示显示更改products哪里有足够的库存在这里

然后您应该能够使用mysqli_affected_rows来确定更新是否发生。

也许是这样的?

START TRANSACTION;
    SELECT @order_quantity:=quantity FROM CART WHERE product_id=1;

    UPDATE products 
    SET stock = CASE WHEN @order_quantity<=stock THEN stock-@order_quantity ELSE stock END
    WHERE product_id=1;

    COMMIT;

这里是小提琴购物车有 10 个产品,库存有 20 个,更新后还剩 10 个。 仅当其 <= 时。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM