2014-10-06 66 views
0

我正在开发一个会计软件,有时候发票包含两次相同的物品ID(每一个都有其唯一的序列号)..所以在销售这两个物品之后,我需要它的数量等于数量-1使用'CASE'更新MySQL记录两次

我使用这个语句更新一些记录

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)

+0

您可能需要以不同的方式构建您的查询,但由于它不是清楚你想要达成的目标,这将很难说明如何。 – 2014-10-06 03:33:03

+0

你想要它是什么?你想要1或2吗?你要求它为你选择,而电脑不会那样工作。 – siride 2014-10-06 03:45:35

+0

这是甚么意思......? _有些时候我的单个查询包含两次相同的ID'LIKE THIS'_ – 2014-10-06 03:53:11

回答

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:[email protected]+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) 
+0

更新3次谢谢gloomy.penguin你的解释回应 首先我需要你知道为什么我需要这个 我正在开发一个会计软件,有时候发票包含两次相同的物品ID(每一个都有其唯一的序列号)..所以在销售这两个物品之后,我需要它的数量等于它本身 - 1 – 2014-10-06 04:17:14

1

你的陈述对每个案例都有相同的条件,总是返回1(第一条陈述),第二条陈述因为条件相同而被忽略。

+0

是否有任何技巧? – 2014-10-06 04:17:35

+0

谢谢你......我自己发现那位招 UPDATE'table1' SET'quantity' = CASE 在ID =(1),然后量-1 在ID =(1 * 1),然后量-1 WHEN ID =(1 * 1 * 1),然后量-1 END WHERE ID(1) 记录将通过相同的查询 – 2017-01-13 00:14:20

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次查询