2013-06-20 43 views
0

我有以下更新查询,当用户登录到他们的帐户中并且在登录之前在其购物车中放置了项目时(帐户上设置的临时帐户),将运行以下更新查询...MySql - 在更新时避免重复记录

UPDATE cart_items SET account_id=$account WHERE account_id=$cookieId; 

这有时候创建一个看起来像这样重复的结果:

id | account_id | itemNumber | itemQuantity 
------------------------------------------ 
20 | 10   | 6   | 2 
25 | 10   | 6   | 1 

我想这样做我写这避免了创造这些重复的记录,只是一个查询留下一个记录是这样的:

id | account_id | itemNumber | itemQuantity 
------------------------------------------ 
20 | 10   | 6   | 3 

我认为使用DUPLICATE KEY UPDATE可能是我正在寻找的东西,但是我无法理解它。任何人都可以帮我吗?

回答

0

||更新||

让我们假设你有一个非登录时使用的临时编号15的用户,他已下令与itemNumber 6 2项:

id | account_id | itemNumber | itemQuantity 
------------------------------------------ 
20 | 15   | 6   | 2 

临时ID存储在变量$ Cookie编号,这拥有价值15 现在让我们假设该用户登录到自己的帐户ID存储在$帐户,和值10

当您要执行查询的登录过程的一部分:

UPDATE cart_items SET account_id=$account WHERE account_id=$cookieId; 

(即使准备好的语句应该是你想看看的东西)。

该条目现在应该是这样的:

id | account_id | itemNumber | itemQuantity 
------------------------------------------ 
20 | 10   | 6   | 2 

现在让我们假设用户10希望购买1个项目6,那么它将使最有意义

SELECT * FROM cart_items WHERE account_id = $account AND itemNumber = $itemNumber; // $itemNumber is 6 

如果查询返回true,那么你

UPDATE cart_items SET itemQuantity = itemQuantity+$numerOfItemsInOrder WHERE $account = $account AND itemNumber = $itemNumber; // $itemNumber is 6 

,否则插入。

你肯定不希望更新ACCOUNT_ID如果用户注销,只有当他在日志中。

+0

嗨,感谢您的反馈...这是我的查询背后的逻辑。用户(未登录)将商品添加到他们的购物车,并且这样的条目被制作成用户账户表和cart_items表。此ID在他们的机器上作为cookie存储。但是,如果此用户有一个帐户然后登录,我想合并注册帐户的购物车项目和基于临时Cookie的帐户,然后从数据库中删除临时帐户。那有意义吗? – Tom

+0

它是有道理的。我会尽力提供更好的建议。我在工作,所以我会看看我的休息时间允许我做什么。 – Jonast92

+0

哈!谢谢。它并不是非常紧迫(但),所以不要太紧张。 – Tom

0

好了,这里是我做了什么......这可能是有点长篇大论,但它的作品...

UPDATE cart_items SET account_id=$account WHERE account_id=$cookieId; 

UPDATE cart_items t 
    JOIN (
    SELECT MinID, b.itemQuantity LatestName 
    FROM cart_items b 
    JOIN (
     SELECT MIN(id) MinID, MAX(id) MaxID 
     FROM cart_items 
     GROUP BY account_id, itemNumber 
     HAVING COUNT(*) > 1 
    ) g ON b.id = g.MaxID 
) rs ON t.id = rs.MinID 
SET t.itemQuantity = t.itemQuantity+LatestName; 

DELETE `cart_items` 
FROM `cart_items` 
LEFT OUTER JOIN (
    SELECT MIN(`id`) as `id`, `account_id`, `itemNumber` 
    FROM `cart_items` 
    GROUP BY `account_id`, `itemNumber` 
) as `KeepRows` ON 
    `cart_items`.`id` = `KeepRows`.`id` 
WHERE 
    `KeepRows`.`id` IS NULL