Php MySql-避免更新时重复记录

Php MySql-避免更新时重复记录,php,mysql,duplicates,Php,Mysql,Duplicates,我有下面的更新查询,当用户登录到他们的帐户时运行,在登录之前在他们的购物车中放置项目(表上设置的临时帐户) 这有时会创建类似以下内容的重复结果: id | account_id | itemNumber | itemQuantity ------------------------------------------ 20 | 10 | 6 | 2 25 | 10 | 6 | 1 id | account_id | itemN

我有下面的更新查询,当用户登录到他们的帐户时运行,在登录之前在他们的购物车中放置项目(表上设置的临时帐户)

这有时会创建类似以下内容的重复结果:

id | account_id | itemNumber | itemQuantity
------------------------------------------
20 | 10         | 6          | 2
25 | 10         | 6          | 1
id | account_id | itemNumber | itemQuantity
------------------------------------------
20 | 10         | 6          | 3
id | account_id | itemNumber | itemQuantity
------------------------------------------
20 | 10         | 6          | 2
我想做的是编写一个查询,避免创建这些重复记录,只留下一条记录,如下所示:

id | account_id | itemNumber | itemQuantity
------------------------------------------
20 | 10         | 6          | 2
25 | 10         | 6          | 1
id | account_id | itemNumber | itemQuantity
------------------------------------------
20 | 10         | 6          | 3
id | account_id | itemNumber | itemQuantity
------------------------------------------
20 | 10         | 6          | 2
我想使用
重复密钥更新
可能是我想要的,但我无法解决这个问题。有人能帮我吗?

|更新||

假设您有一个临时id为15的未登录用户,并且他订购了两个itemNumber为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
25 | 10         | 6          | 1
id | account_id | itemNumber | itemQuantity
------------------------------------------
20 | 10         | 6          | 3
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
,则插入其他内容


如果用户注销,您肯定不想更新帐户id,只有在他登录时才更新。

好的,下面是我所做的。。。这可能有点冗长,但它的工作

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

嗨,谢谢你的反馈。。。这是我的疑问背后的逻辑。用户(未登录)将项目添加到他们的购物车中,因此会在用户帐户表和购物车项目表中创建条目。此ID作为cookie存储在他们的计算机上。但是,如果该用户拥有一个帐户,然后登录,我希望合并已注册帐户和基于cookie的临时帐户的购物车项目,然后从数据库中删除该临时帐户。有道理吗?有道理。我会尽量提供一个更好的建议。我在工作,所以我会看看我的咖啡休息时间允许我做什么。哈!谢谢这不是非常紧急(还没有),所以不要强调太多。告诉我,第二个条目(25 | 10 | 6 | 1)是自动发生的(当然,这没有意义),还是当前用户碰巧又订购了1个项目6?我只是在想,是否应该作为登录过程的一部分,从临时用户订购的购物车中取出所有物品,并在他可以执行更多订单之前更新其id。基本上:您是在他再次下单时还是登录时进行更新?嗯,他们在未登录时已将第6项中的1项放在购物车中,之前在登录时已将第6项中的2项放在购物车中。因此,我假设他们总共需要3个(在他们登录后,我将显示一条消息警告他们这一点)。更新是在他登录时进行的。。。