如何根据条件更新多列?

时间:2016-06-03 16:41:49

标签: mysql sql sql-update

我有这个问题:

UPDATE user
   SET reputation = reputation + 
                    (CASE id WHEN :op   THEN 2 
                             WHEN :user THEN 15 
                     END)
WHERE user in (:user, :op)

我还希望根据CASE()函数的条件再更新一列。目前我通过另一个查询来做到这一点:

UPDATE user
   SET fee = fee + 
             (CASE id WHEN :op   THEN (SELECT SUM(op_val) FROM money WHERE id = :post_id)
                      WHEN :user THEN (SELECT SUM(user_val) FROM money WHERE id = :post_id)
              END)
WHERE user in (:user, :op)

您看到上述两个查询的条件相同。我该如何混合它们并进行单一查询呢?

1 个答案:

答案 0 :(得分:2)

您的第一个查询看起来很奇怪。为什么要将userid的混合比较用于输入变量。你打算这个吗?

UPDATE user
   SET reputation = reputation + 
                    (CASE id WHEN :op   THEN 2 
                             WHEN :user THEN 15 
                     END)
WHERE id in (:user, :op);

set子句可以设置多个列:

UPDATE user
    SET reputation = reputation + 
                        (CASE user WHEN :op   THEN 2 
                                   WHEN :user THEN 15 
                         END),
        fee = fee + 
             (CASE user WHEN :op   THEN (SELECT SUM(op_val) FROM money WHERE id = :post_id)
                        WHEN :user THEN (SELECT SUM(user_val) FROM money WHERE id = :post_id)
              END)
WHERE user in (:user, :op);

您还可以将第二个条件写为:

        fee = fee + 
             (SELECT SUM(CASE id WHEN :op THEN op_val ELSE user_val END) FROM money WHERE id = :post_id)