使用包含重复项的数组更新SQL值

6

在编写购物网站时,我需要更新产品库存。

但问题在于,购物车中自然可以重复添加同一商品。

更新它的最佳方式是什么?

我尝试了使用IN,但以下SQL查询返回了3个项目。

SELECT * 
FROM  `products` 
WHERE id
IN ( 3, 4, 4, 6 ) 
LIMIT 0 , 30

这是我的解决方案,但我认为这不是最好的。

$cart = array(1,3,4,4,5,8,22,22);
$itemlist = array_count_values($cart);

foreach($itemlist as $itemid=>$ocurrence){
    $SQL = "UPDATE products SET stock = stock-".$ocurrence." WHERE id = ".$itemid;
    mysql_query($SQL);
}

3
我认为这种方法很好。如果要获取不同的值,你必须在循环中执行更新操作。 - Michael Berkowski
同意@MichaelBerkowski的观点。除非您有可证明的性能问题(例如大量用户或大量产品/购物车),否则我建议您坚持现有的方法。可能可以通过更聪明的编码在单个查询中执行更新,但这将是一个复杂的解决方案,在长期内难以维护。 - mellamokb
4
你可能听说过这个建议,考虑使用支持预处理语句的新API(如MySQLi或PDO)。这实际上会稍微提高循环的性能,并增加其他查询的安全性。 - Michael Berkowski
@MichaelBerkowski 这是我的第二个购物网站,网站流量真让我感到害怕。那就这样吧,谢谢你。我对PDO一无所知,不知道查询是否相同。如果需要的话,我可以进行更改,但目前还不能。 - siniradam
唯一更好的解决方案是将购物车存储在数据库中。然后,您可以通过连接表来进行更新。 - Gordon Linoff
2个回答

1

0
如果可能的话,请创建一个名为item_cart的单独表,其主键为(cart_id,item_id,product_id)。从这里,您可以对product_id进行分组,以查看销售了多少个产品。
select product_id, count(product_id) as "No of Product Sold" from item_cart
group by product_id

你的 PHP 代码将完美地更新库存列中的产品数量。

如果可能的话,你可以尝试设置触发器,在每次销售任何产品时更新库存列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接