发布
社区首页 >问答首页 >使用“CASE”更新两次MySQL记录

使用“CASE”更新两次MySQL记录
EN

Stack Overflow用户
提问于 2014-10-06 03:28:27
回答 3查看 263关注 0票数 0

我正在开发一个会计软件,有时发票上有两次相同的项目id (每一个都有其唯一的序列号)。所以在卖掉这两件商品之后,我需要它的数量等于数量-1

我用这个声明来更新一些记录。

代码语言:javascript
代码运行次数:0
复制
    UPDATE `table1` SET `quantity` = CASE
    WHEN id = 1 THEN quantity-1
    WHEN id = 1 THEN quantity-1
    END
    WHERE id in (1)

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

我怎么才能解决这个问题?

编辑

答案

谢谢..。我一个人找到了诀窍

代码语言:javascript
代码运行次数:0
复制
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)在同一个语句中多次更新数量

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-10-06 04:01:16

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

代码语言:javascript
代码运行次数:0
复制
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)

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

代码语言:javascript
代码运行次数:0
复制
UPDATE `table1` SET `mcount` = CASE
    WHEN id = 1 THEN 1
    WHEN id = 1 THEN 2
    END
    WHERE id in (1)

这相当于..。(psuedo)

代码语言:javascript
代码运行次数:0
复制
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中添加一个

代码语言:javascript
代码运行次数:0
复制
UPDATE `table1` 
   SET `mcount` = mcount + 1; 
 WHERE id in (1) 

下面将切换mcount

代码语言:javascript
代码运行次数:0
复制
UPDATE `table1` 
   SET `mcount` = CASE WHEN mcount = 1 THEN 2
                       WHEN mcount = 2 THEN 1 END
 WHERE id in (1) 

下面将切换mcount

代码语言:javascript
代码运行次数:0
复制
UPDATE `table1` 
   SET `mcount` = CASE WHEN other_field = 'Y' THEN 1
                       WHEN other_field = 'N' THEN 2 END
 WHERE id in (1) 

使用多个ID值.

代码语言:javascript
代码运行次数:0
复制
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) 

这和..。

代码语言:javascript
代码运行次数:0
复制
UPDATE `table1` 
   SET `mcount` = id
 WHERE id in (1,2,3) 

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

还有..。

代码语言:javascript
代码运行次数:0
复制
set @row:=0; 
update table1 
       set mcount = @row:=@row+1  
where  id = 1; 
代码语言:javascript
代码运行次数:0
复制
mysql> select * from table1;
+------+--------+
| id   | mcount |
+------+--------+
|    1 |      1 |
|    1 |      2 |
|    1 |      3 |
|    2 |      0 |
+------+--------+
4 rows in set (0.00 sec)
票数 1
EN

Stack Overflow用户

发布于 2014-10-06 03:46:14

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

票数 1
EN

Stack Overflow用户

发布于 2017-01-13 00:44:16

谢谢..。我一个人找到了诀窍

代码语言:javascript
代码运行次数:0
复制
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次。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26209662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档