用条件 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 更新具有其他字段总和的字段的主要内容,如果未能解决你的问题,请参考以下文章