从mysql db中比较并删除重复项

时间:2017-01-30 02:54:04

标签: php mysql

示例表(购物车):

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'");
   }
}

我不知道从哪里开始这样做。

谢谢

2 个答案:

答案 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'