示例表(购物车):
itemid | userid | amount
------ | ------------- | -------
2 | 8.8.4.4 | 9
2 | usr@gmail.com | 3
示例:IP:8.8.4.4属于usr@gmail.com,用户在没有帐户的情况下将一些项目添加到购物车中。一旦他登录,他就注意到之前会话中他之前购物车的商品仍在那里,但现在他在购物车中看到了两次相同的商品。
我如何在登录时将这两行合并为一行,其中金额值更新为(在本例中为12)并且用户ID更新为usr@gmail.com。 itemid应该保持不变。
目前,我尝试使用以上示例替换以下内容:
$getIPdata = "SELECT * FROM cart WHERE userid = '$IP'";
$IPcartdata = $mysqli->query($getIPdata);
if ($IPcartdata->num_rows > 0) {
while($row = $IPcartdata->fetch_assoc()) {
mysqli_query($mysqli, "UPDATE cart SET userid = '$login_session' WHERE userid = '$IP'");
}
}
我不知道从哪里开始这样做。
谢谢
答案 0 :(得分:0)
您可以使用三个查询执行此操作,而无需获取任何数据:
UPDATE cart SET userid = '8.8.4.4' WHERE userid = 'usr@gmail.com';
INSERT INTO cart (itemid, userid, amount)
SELECT itemid, 'usr@gmail.com', SUM(amount) FROM cart
WHERE userid = '8.8.4.4' GROUP BY itemid;
DELETE FROM cart WHERE userid = '8.8.4.4';
您应该使用InnoDB表并将这些查询包装在单个事务中,以确保执行所有查询或不执行任何查询。
第一个UPDATE将userid设置为IP地址而不是用户名可能看起来有点令人惊讶。这样做基本上使用与IP地址相关联的购物车作为某种临时存储,以保留两个购物车中的所有条目,然后将它们汇总到最终购物车中。
如果你的表有一个UNIQUE或PRIMARY键,覆盖两个 itemid和userid(ALTER TABLE cart ADD UNIQUE itemid_userid_idx (itemid, userid);
),这不起作用(初始UPDATE可能会产生冲突),但在这种情况下你只需要两个查询就可以做到这一点:
REPLACE INTO cart (itemid, userid, amount)
SELECT itemid, 'usr@gmail.com', SUM(amount) FROM cart
WHERE userid = '8.8.4.4' OR userid = 'usr@gmail.com'
GROUP BY itemid;
DELETE FROM cart WHERE userid = '8.8.4.4';
但请记住,这绝对需要我提到的UNIQUE索引,因为REPLACE需要这样才能识别重复项。
答案 1 :(得分:-1)
这个怎么样?需要三个步骤。
select sum(amount) from cart where userid = '$IP' // fetch the result and save it in, say, $sum
update cart set amount = amount + $sum where userid = '$login_session'
delete from cart where userid='$IP'