【问题标题】:UPDATE a field with sum of other fields with conditions MYSQL用条件 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 - 组函数的使用无效
  • 见规范化。任何不建议标准化的答案都只是在浪费您的时间。

标签: mysql


【解决方案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))

    【讨论】:

      猜你喜欢
      • 2016-02-20
      • 2012-05-11
      • 2011-05-11
      • 2013-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多