nTuply:
私は、チェックアウトシステムを構築しようとしています。私は3つのテーブル、完了した注文を保持しているユーザーのカートと1を保持している製品と1を保持しているものを持っています。
プロダクト
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
私はをやろうとしていることは製品にSELECTを行うと証券は、ユーザーのカートから数量以上であるかどうかを確認します。これが本当であるならば、それはMYSQLクエリで直接株式数を減少させます。
今、私がいる問題は、これが可能である場合、私は知らない、です。私はPHPでそれを行うことができますが、それは私はそれがあまりにも最適化されていない場合には避けたいかなりの数回の反復を、かかります。
私の周りを検索し、私はここで部分的な解決策を見つけた:MySQLは-そして、UPDATEを選択します
しかし、私はそれにIFを含める方法を知りません。
ニック:
これは使用して、1つのクエリで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
更新が行われたかどうかを判断します。