我有一个名为cart
的数据库表的购物车,用于存储每个SaaS实例购物车中的商品记录。我想要做的是,如果产品被添加到用户的购物车并且已经存在相同的记录,则只有当status =时才更新表中的数量列等于旧值加上新值。 0,否则,输入新记录。
故障:
如果项目已在购物车中,请更新数量列以仅在状态栏= 0时设置新数量值,否则,将项目作为新行添加到购物车表格。
$itemList = $db->query("INSERT INTO
cart(
`lmsid`,
`userid`,
`courseid`,
`assigned_by`,
`assigned_on`,
`quantity`)
VALUES(
:lmsid,
:userid,
:courseid,
:assigned_by,
:assigned_on,
1)
ON DUPLICATE KEY UPDATE
`quantity` = `quantity` + values('quantity')
)",
array(
"lmsid"=>$core['id'],
"userid"=>$user,
"courseid"=>$_POST['courseid'],
"assigned_by"=>$userInfo['id'],
"assigned_on"=>time())
);
Unhandled Exception. SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '66-2' for key 'useridAndCourseid'
表格中的键useridAndCourseid
是:
UNIQUE KEY `useridAndCourseid` (`userid`,`courseid`)
当从购物车中删除产品时,状态列会更新为“1”,此记录会永久保留在我们的记录中。当产品再次支付我们的记录时,状态将更新为“2”。当记录刚好等待处理时,它的状态为0。
目前查询工作一半,但我只是不知道怎么说'如果记录存在且状态= 0更新数量,否则,插入新记录'。这实际上是我想要实现的所有目标,但我认为我试图让它复杂化,或者我花了这么长时间试图过度复杂化我忘记了我追求的东西!我确信有一个简单的解决方案。如果我只能使用ON DUPLICATE KEY和WHERE子句......
感谢您的帮助!
答案 0 :(得分:1)
有多种方法可以解决这个问题。但是,如果您想要insert
的单个语句,则需要创建一个可以执行所需操作的唯一索引。此索引应该有一个列,在0
和其他时间status = 0
时会显示某个值(例如NULL
)。 NULL
值不被视为重复键。您可以将其称为IsActiveFlag
。
如果您有这样的列,那么索引:
create index idx_cart(userid, courseid, IsActiveFlag)
应该允许你做你想做的事。