用条件 MYSQL 更新具有其他字段总和的字段

Posted

技术标签:

【中文标题】用条件 MYSQL 更新具有其他字段总和的字段【英文标题】:UPDATE a field with sum of other fields with conditions MYSQL 【发布时间】:2015-06-30 12:33:24 【问题描述】:

我的表结构如下

counter1|counter1_status|counter2|counter2_status|counter3|counter3_status|valid_counter
-----------------------------------------------------------------------------------------
 5                 0             6            1               3               1                XXXX

我想要一个更新查询将 valid_counter 更新为 6 + 3 = 9 由于counter1_status = 0,所以不应该添加counter1

尝试了以下查询,但它给出了错误。

更新 counter_table SET 有效联系人 = SUM((CASE WHEN counter1_status=1 THEN counter1 ELSE 0 END) + (CASE WHEN counter2_status=1 THEN counter2 ELSE 0 END) + (CASE WHEN counter3_status=1 THEN counter3 ELSE 0 END))

我可以使用 SELECT 查询得到总和而没有任何错误,但更新查询失败。

【问题讨论】:

它会给你什么错误? #1111 - 组函数的使用无效 见规范化。任何不建议标准化的答案都只是在浪费您的时间。 【参考方案1】:

如果您想有条件地将 (counter1,counter2,counter3) 的总和存储在 valid_contace 字段中,您可以使用:

UPDATE counter_table 
SET valid_contact = 
(CASE WHEN counter1_status=1 THEN counter1 ELSE 0 END) 
+ (CASE WHEN counter2_status=1 THEN counter2 ELSE 0 END) 
+ (CASE WHEN counter3_status=1 THEN counter3 ELSE 0 END)
where id=5

【讨论】:

已经试过了。它还给出错误 - #1093 - 您不能在 FROM 子句中指定目标表 'counter_table' 进行更新 我不知道 OP 是否希望所有记录都具有相同的聚合值。 @PramodSahoo 我编辑了查询,它解决了你的问题吗? 不,我需要单条记录更新,我会在最后使用 where 条件 @PramodSahoo 请发布您的where clause【参考方案2】:
UPDATE counter_table AS c1 JOIN 
(SELECT id, SUM((CASE WHEN counter1_status=1   THEN counter1 ELSE 0 END) 
    + (CASE WHEN counter2_status=1 THEN counter2 ELSE 0 END) 
    + (CASE WHEN counter3_status=1 THEN counter3 ELSE 0 END)) AS m 
FROM counter_table) AS c2
    USING (id)
    SET c1.`valid_counter` = c2.m;

Sample fiddle

【讨论】:

【参考方案3】:

终于找到了错误的解决方案:

应从查询中删除 SUM。

应该是 SUM(a,b,c)

或a+b+c。

更新 counter_table SET 有效联系人 = ((CASE WHEN counter1_status=1 THEN counter1 ELSE 0 END) + (CASE WHEN counter2_status=1 THEN counter2 ELSE 0 END) + (CASE WHEN counter3_status=1 THEN counter3 ELSE 0 END))

【讨论】:

以上是关于用条件 MYSQL 更新具有其他字段总和的字段的主要内容,如果未能解决你的问题,请参考以下文章

PHP怎么取得MYSQL字段(值)的总和!

有没有办法在 MongoDB 中获取具有 WHERE (SQL) 等条件的字段总和

PHP如何取得mysql字段值并记算时间?

取决于其他相同字段的Mysql行值总和[关闭]

TP5中多字段聚合查询,多字段运算总和(其他运算)

mysql多表关联更新