2017-01-30 3 views
2

Пример таблицы (корзину):сравнить и удалить дубликаты из БД MySQL

itemid | userid  | amount 
------ | ------------- | ------- 
2  | 8.8.4.4  | 9 
2  | [email protected] | 3 

Пример: IP: 8.8.4.4 принадлежит [email protected], пользователь добавил некоторые элементы в своей корзине без учета. как только он вошел в систему, он заметил, что его предыдущие позиции в корзине с предыдущей сессии все еще есть, но теперь он видит тот же самый пункт дважды в своей тележке.

Как я могу при входе в систему объединить эти две строки в одну строку с обновленным значением (в данном случае) 12 и обновленным пользователем [email protected] Элемент должен оставаться неизменным.

В настоящее время я делаю следующее, который я пытаюсь заменить на примере выше:

Я понятия не имею, где начать делать это.

Thanks

+1

Не работает ли ваш код? Что происходит, когда вы запускаете этот код? Кроме того, почему вы используете '$ mysqli-> query (...)' для выбора, но 'mysqli_query ($ mysqli, ...)' для обновления? – Sean

+0

@Sean спасибо за ответ, код, который я вставил, был всего лишь примером того, что я делаю сейчас, я пытаюсь заменить его лучшим решением. Который я понятия не имею, как это сделать (см. Пример моего объяснения). – Niels

+2

IP-адреса не являются людьми и не должны быть связаны как таковые. Если бы у вас было два пользователя в одной сети, их тележки столкнулись бы. – chris85

ответ

-1

Как насчет этого? Вам нужно три шага.

select sum(amount) from cart where userid = '$IP' // fetch the result and save it in, say, $sum 

update cart set amount = amount + $sum where userid = '$login_session' 

delete from cart where userid='$IP' 
+1

Вы можете захотеть изменить подзапрос на 'select сумму от корзины, где userid = '$ IP «GROUP BY userid» в случае, если имеется несколько повторяющихся строк. – Sean

+0

@что, что, похоже, не работает для меня, не является частью элемента или не может игнорировать это в этом случае? также, это может быть глупый вопрос, но эти два отдельных запроса или один? – Niels

+0

@ Вы заметили, что вы имеете в виду использование группы и сумму между скобками в запросе sean? Спасибо за вашу помощь. Я очень ценю это! – Niels

0

Вы можете сделать это с тремя запросами без извлечения каких-либо данных:

UPDATE cart SET userid = '8.8.4.4' WHERE userid = '[email protected]'; 
INSERT INTO cart (itemid, userid, amount) 
    SELECT itemid, '[email protected]', SUM(amount) FROM cart 
    WHERE userid = '8.8.4.4' GROUP BY itemid; 
DELETE FROM cart WHERE userid = '8.8.4.4'; 

Вы должны использовать таблицы InnoDB и обернуть эти запросы в одной транзакции, чтобы убедиться, что все или ни один из запросы выполняются.

Может показаться немного удивительным, что первый UPDATE устанавливает идентификатор пользователя для IP-адреса вместо имени пользователя. Это делается для того, чтобы по существу использовать тележку, связанную с IP-адресом, в качестве своего рода временного хранилища для хранения всех записей с обеих телег, прежде чем суммировать их в последнюю корзину.

Если таблица имеет уникальный или первичный ключ, охватывающий как Itemid и идентификатор пользователя (ALTER TABLE cart ADD UNIQUE itemid_userid_idx (itemid, userid);), это не работает (начальная UPDATE может привести к конфликтам), однако в этом случае вы можете сделать это вместо того, чтобы всего два запросы:

REPLACE INTO cart (itemid, userid, amount) 
    SELECT itemid, '[email protected]', SUM(amount) FROM cart 
    WHERE userid = '8.8.4.4' OR userid = '[email protected]' 
    GROUP BY itemid; 
DELETE FROM cart WHERE userid = '8.8.4.4'; 

Но имейте в виду, что это абсолютно требует уникального индекса я упомянул, так как это необходимо по ЗАМЕНИТЬ распознавать дубликаты.

Смежные вопросы