我不确定它是否可能,只是想知道它是否可行。我的列plan_popular
的默认值为0
。让我有一个列表:
Plan Name | plan_popular | amount
===================================
plan A 0 25.00
plan B 1 50.00
plan C 0 90.00
这就是我的表现:
$stmt = "update {CI}plans set plan_popular = 0";
$this->db->query($stmt);
$stmt2 = "update {CI}plans set plan_popular = 1 where plan_id = ?";
$this->db->query( $stmt2, array($plan_id) );
现在我已经设定了C计划。现在我想重置它,并希望将流行计划C设置为1.我正在做的是运行两个查询,一个我重置并使plan_popular
0,第二个是将计划C更新为1有id。单个查询是否可能?
答案 0 :(得分:1)
您可以使用表达式来确定要分配的值:
UPDATE {CI}plans
SET plan_popular = IF(plan_id = ?, 1, 0);
答案 1 :(得分:1)
试试这个,
UPDATE {CI}plans
SET `plan_popular` = CASE `Plan Name`
WHEN 'plan C' THEN 1
ELSE 0
END
WHERE `Plan Name` IN((select `Plan Name` from {CI}plans where plan_popular=1 ) , 'plan C');
答案 2 :(得分:0)
更新可能很昂贵,操作锁定,触发器和约束触发等等。通常,您希望避免将字段更新为已有的相同值。在英语中,如果plan_id = variable且plan_popular为0,则将其设置为1,但如果plan_id为任何其他值且plan_popular为1,则将其设置为0.
UPDATE {CI}Plans
SET plan_popular = if( plan_id = ?, 1, 0 )
where (plan_id = ? and plan_popular = 0)
or (plan_id <> ? and plan_popular = 1);
where子句只允许通过更新实际更改的那些行。如果这是一个较大的表,那可能会对响应时间产生很大影响。逻辑比在数据库中执行的任何实际操作便宜得多。