【问题标题】:Doing a SELECT and UPDATE simultaneously IF a condition is met in MySQL如果在 MySQL 中满足条件,则同时执行 SELECT 和 UPDATE
【发布时间】:2020-07-09 12:55:34
【问题描述】:

我正在尝试构建一个结帐系统。我有 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 并检查 Stock 是否大于用户购物车中的数量。如果这是真的,那么它会直接在 MYSQL 查询中减少 Stock 计数。

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

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

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

【问题讨论】:

  • 我想这可以通过使用 MySQL IF 来完成,但问题是应该这样做。运行两个查询没有任何问题,特别是因为运行其中一个是可选的。您可能过早地进行了优化。另外 - 如果您将其全部合并到一个条件更新中,如果值实际更新或更新被阻止,您将不会收到反馈(似乎是向客户显示的有价值的信息)。
  • 如果 all 库存大于(或等于?)购物车中的数量或 any 库存,您要更新吗?
  • @Nick 全部库存。正如您在此示例中看到的那样,我演示了一个不会发生这种情况的情况,因此我不确定这对 MySQL 是否有意义,或者我是否必须使用 PHP 并首先遍历购物车,然后执行在每个购物车项目上选择以检查库存并持有一个布尔值,如果所有库存实际上都更大,则最后在产品表中进行更新,然后清除购物车。它在 PHP 中似乎过于复杂。我想知道是否有办法用 MySQL 更快地做到这一点。 (或者即使这是有道理的)
  • @El_Vanja 你问了一个很好的问题,是吗?请参阅我上面对尼克的评论。我担心如果 2 个用户几乎同时点击结帐会发生什么。
  • 哪个版本的 MySQL?

标签: php mysql


【解决方案1】:

也许是这样的?

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;

Here is fiddle 购物车有 10 件商品,库存有 20 件,更新后还剩 10 件。只有当它

【讨论】:

    【解决方案2】:

    这可以在 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
    

    演示显示没有变化,因为库存不足here。演示显示对products 的更改,其中有足够的库存here

    然后您应该能够使用mysqli_affected_rows 来确定是否进行了更新。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-24
    • 2018-12-21
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2021-12-31
    • 2013-08-08
    相关资源
    最近更新 更多