[英]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.