SQL中的多条件批量更新& PHP

时间:2009-08-28 13:48:32

标签: php sql

如果我想根据条件更新列值,我可以使用下面的查询来获得一个simpel +1 -1的情况(当然,转换为正确的PHP调用或等效的ORM):

UPDATE articles SET STATUS = 0 WHERE STATUS  = 1;

但现在的问题是,我想根据原文status,从字典中推断出status的新值。假设字典是这样的:

dict['1']='3'
dict['12']='2'
dict['6']='2'

键值对之间没有关系。 dict是一个PHP字典对象,这就是我所说的“in memory dictionary”。

如何撰写此查询?

编辑:问题编辑。我没有正确构建问题......对不起!

4 个答案:

答案 0 :(得分:4)

如果您的映射数量很少,那么您可以使用case语句。

BEGIN TRAN

UPDATE articles
SET status = 
       case 
          when status=1 then 3 
          when status=12 or status=6 then 2 
          else status --leave it unchanged if it doesn't match a case
       end

--COMMIT OR ROLLBACK

否则采用rwmnau

建议的映射表方法

答案 1 :(得分:1)

使用子查询:

UPDATE articles AR SET status = (SELECT value FROM dict WHERE key = AR.status)

当然,我假设你的数据库中存有字典。

答案 2 :(得分:1)

这样的事情怎么样:

UPDATE articles
   SET status = n.new
  FROM articles a
  JOIN NewStatus n
    ON a.status = n.status

这样,您就有了第二个名为“NewStatus”的表,它有两列 - 一个名为“status”,具有您现有的状态,另一个名为“New”,具有您希望它更新的状态。加入该表,进行更新,这应该解决它。此外,如果您不想更新任何状态,只需将它们包含在NewStatus表中 - 然后在更新语句中跳过它们。

看起来问题已被修改,所以如果我错过了这一点,请告诉我!

答案 3 :(得分:1)

由于你的问题不清楚,你似乎在混合代码和SQL,你可以做这样的事情(伪Java):

StringBuilder sb = new StringBulder();

for (Map.Entry<Integer,Integer> entry : codes.entrySet) {

    sb.append(
      String.format("UPDATE articles SET Status=%s WHERE Status=%s\n", entry.getValue(), entry.getKey() 
       );

}

String sqlToExecute = sb.toString();
System.out.println(sqlToExecute);

这将为您提供执行以进行更改的SQL。如果这个代码更像是一个代码,那么就去掉String格式并改用预处理语句。