2013-06-20 4 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 и что он заказал 2 пунктов с ItemNumber 6:

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

временный идентификатор хранится в переменной $ cookieId, который имеет значение 15. Теперь давайте предположим, что этот пользователь входит в его учетную запись с идентификатором хранится в $ счета, со значением 10.

в качестве части процесса логарифмический в которую вы хотите выполнить запрос:

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

(Хотя подготовленные заявления должны быть тем, на что вы хотели бы взглянуть).

Запись должна выглядеть следующим образом:

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

Теперь давайте предположим, что пользователь 10 хочет купить еще один пункт 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. Этот идентификатор хранится как файл cookie на своей машине. Однако, если у этого пользователя есть учетная запись и затем входит в систему, я хочу объединить элементы корзины зарегистрированной учетной записи и временную учетную запись на основе файлов cookie, а затем удалить временную учетную запись из базы данных. Имеет ли это смысл? – Tom

+0

Это имеет смысл. Я постараюсь предложить лучшее предложение. Я на работе, поэтому я посмотрю, что мне разрешает мой кофе. – Jonast92

+0

Ha! Благодарю. Это не очень актуально (пока), поэтому не слишком подчеркивайте. – 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 
Смежные вопросы