0

我有以下更新查询,当用户登录他们的帐户并在登录之前将物品放入购物车时运行(在桌子上设置的临时帐户)......

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

我认为 usingDUPLICATE KEY UPDATE可能是我正在寻找的东西,但我无法理解它。谁能帮帮我?

4

2 回答 2

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
于 2013-06-21T12:06:01.000 回答
0

|| 更新 ||

假设您有一个临时 ID 为 15 的未登录用户,并且他订购了 2 件商品编号为 6 的商品:

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

临时 id 存储在变量 $cookieId 中,其值为 15。现在假设该用户登录到他的帐户,其 id 存储在 $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,只有在他登录时才更新。

于 2013-06-20T13:45:06.673 回答