2013-06-20 73 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