Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL&;中的多条件批量更新;PHP_Php_Sql - Fatal编程技术网

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

SQL&;中的多条件批量更新;PHP,php,sql,Php,Sql,如果我想根据某个条件更新列值,我可以使用下面的查询来处理simpel+1-1情况(当然,可以转换为正确的PHP调用或ORM等价物): 但现在的问题是,我想根据原始的状态,从字典中推断出状态的新值。假设字典是这样的: dict['1']='3' dict['12']='2' dict['6']='2' UPDATE articles SET status = n.new FROM articles a JOIN NewStatus n ON a.status = n.sta

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

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

dict['1']='3'
dict['12']='2'
dict['6']='2'
UPDATE articles
   SET status = n.new
  FROM articles a
  JOIN NewStatus n
    ON a.status = n.status
键值对之间没有关系。
dict
是一个PHP字典对象,这就是我所说的“
内存字典”

如何编写此查询

编辑:问题编辑。我没有正确地提出这个问题。。。对不起

使用子查询:

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

当然,我假设您的数据库中存储了字典。

这样的东西怎么样:

dict['1']='3'
dict['12']='2'
dict['6']='2'
UPDATE articles
   SET status = n.new
  FROM articles a
  JOIN NewStatus n
    ON a.status = n.status
这样,您就有了第二个名为“NewStatus”的表,该表有两列—一列名为“status”,其中包含您的现有状态,另一列名为“New”,其中包含您希望更新的状态。加入该表,进行更新,这将解决问题。另外,如果您不想更新任何状态,只需不要将它们包含在NewStatus表中,那么它们将在update语句中被跳过

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

看起来这个问题已经被修改了,所以如果我没抓住要点,请告诉我

如果有少量映射,则可以使用
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建议的映射表方法,因为您的问题不清楚,而且您似乎混合了代码和SQL,您可以这样做(伪Java):

StringBuilder sb=新StringBulder();
for(Map.Entry:codes.entrySet){
附加(
String.format(“更新文章集状态=%s,其中状态=%s\n”),entry.getValue(),entry.getKey()
);
}
字符串sqlToExecute=sb.toString();
System.out.println(sqlToExecute);

这将为您提供执行更改所需的SQL。如果此代码更像是一次性代码,那么请放弃字符串格式,改用准备好的语句。

如果状态已处于其最大值,该怎么办?我必须更新此问题以使其反映我的情况。如果它是内存中的词典,您在哪里R从?某种应用程序?形成更新?有没有办法将字典写入数据库中的表,然后使用我的答案中的查询进行更新?什么意思是“键-值对之间没有关系”。它们是相关的,因为键映射到值。我猜你是想说没有simple formula mapping Themes.WTF,我以为你接受了这个问题的答案?但现在它被编辑成了另一个问题。你应该问一个新问题,现在有人对我原来问题的答案投了反对票,这不适用于这个新问题。谢谢!很好的尝试,但dict不是一个数据库表——它是一个内存字典如果是一个表,这可以通过连接而不是子查询来完成,这对服务器来说非常省力。@rwmnau:Good point;)@Ngu-Soon-Hui:内存字典是什么意思?这是我最初的想法,但我无法从他的示例中看出表有多大。如果这是一次性的,而且桌子的大小可以控制,那么这可能是最简单的方法。