使用' CASE'更新MySQL记录两次

时间:2014-10-06 03:28:27

标签: mysql case

我正在使用会计软件,有时发票包含相同的商品ID两次(每个都有其唯一的序列号)..所以在销售这两件商品后我需要的数量等于数量-1

我正在使用此声明更新一些记录

    UPDATE `table1` SET `quantity` = CASE
    WHEN id = 1 THEN quantity-1
    WHEN id = 1 THEN quantity-1
    END
    WHERE id in (1)

使用此语句更新后,quantity的值将忽略第二个语句

我该如何解决这个问题?

修改

答案

谢谢......我自己找到了这个伎俩

UPDATE `table1` SET `quantity` = CASE
WHEN id = (1*(1/1)) THEN quantity-1
WHEN id = (1*(2/2)) THEN quantity-1
WHEN id = (1*(3/3)) THEN quantity-1
END
WHERE id in (1)

记录将由同一查询更新3次

为什么我需要这个?

因为我的软件接受用户可以在同一张发票中多次添加相同的(产品ID),所以我需要查询在同一个语句中多次更新数量(产品ID)

3 个答案:

答案 0 :(得分:1)

你的语句对每种情况都有相同的条件,总是会返回1(第一个语句),第二个语句将被忽略,因为它是相同的条件。

答案 1 :(得分:1)

我认为这可能实际上就是你想要的。我的表中有id=1 3次,因此mcount设置为3。由于where条件,ID=2的行未更新。

update table1  
       join (select id, count(*) as ct from table1 group by id) as ct_tbl 
   set mcount = ct_tbl.ct  
 where table1.id=1 

 mysql> select * from table1;
+------+--------+
| id   | mcount |
+------+--------+
|    1 |      3 |
|    1 |      3 |
|    1 |      3 |
|    2 |      0 |
+------+--------+
4 rows in set (0.00 sec)

我不想劫持另一个答案,因为它完全正确,但我认为需要更多解释。

UPDATE `table1` SET `mcount` = CASE
    WHEN id = 1 THEN 1
    WHEN id = 1 THEN 2
    END
    WHERE id in (1)

相当于......(伪造)

in the table table1 
where the id = 1 
   if id = 1 then set mcount = 1 
   if id = 1 then set mcount = 2  

由于where语句,我们已经知道我们只会选择id=1的行。那些if语句只会相互覆盖。我真的不知道你之后会怎样但通常......

以下内容将向mcount

添加一个
UPDATE `table1` 
   SET `mcount` = mcount + 1; 
 WHERE id in (1) 

以下内容将切换mcount

UPDATE `table1` 
   SET `mcount` = CASE WHEN mcount = 1 THEN 2
                       WHEN mcount = 2 THEN 1 END
 WHERE id in (1) 

以下内容将切换mcount

UPDATE `table1` 
   SET `mcount` = CASE WHEN other_field = 'Y' THEN 1
                       WHEN other_field = 'N' THEN 2 END
 WHERE id in (1) 

使用多个ID值...

UPDATE `table1` 
   SET `mcount` = CASE WHEN id = 1 THEN 1
                       WHEN id = 2 THEN 2
                       WHEN id = 3 THEN 3 END
 WHERE id in (1,2,3) 

与......相同。

UPDATE `table1` 
   SET `mcount` = id
 WHERE id in (1,2,3) 

现在真正的问题是...... 如果ID = 1那么mcount应该是什么?

...也

set @row:=0; 
update table1 
       set mcount = @row:=@row+1  
where  id = 1; 
mysql> select * from table1;
+------+--------+
| id   | mcount |
+------+--------+
|    1 |      1 |
|    1 |      2 |
|    1 |      3 |
|    2 |      0 |
+------+--------+
4 rows in set (0.00 sec)

答案 2 :(得分:1)

谢谢......我自己找到了这个伎俩

UPDATE `table1` SET `quantity` = CASE
WHEN id = (1*(1/1)) THEN quantity-1
WHEN id = (1*(2/2)) THEN quantity-1
WHEN id = (1*(3/3)) THEN quantity-1
END
WHERE id in (1)

记录将由同一查询更新3次