我有以下更新查询,当用户登录到他们的帐户时,会在登录前在其购物车中放置项目(桌面上设置的临时帐户)时运行...
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 :(得分:0)
||更新了||
假设您有一个未登录的用户,其临时ID为15,并且他已经使用itemNumber 6订购了2个项目:
id | account_id | itemNumber | itemQuantity
------------------------------------------
20 | 15 | 6 | 2
临时ID存储在变量$ cookieId中,其值为15。 现在让我们假设这个用户登录到他的账户,账号存储在$ account中,值为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。
答案 1 :(得分: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