SQL&;中的多条件批量更新;PHP
如果我想根据某个条件更新列值,我可以使用下面的查询来处理simpel+1-1情况(当然,可以转换为正确的PHP调用或ORM等价物): 但现在的问题是,我想根据原始的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
状态
,从字典中推断出状态
的新值。假设字典是这样的:
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:内存字典是什么意思?这是我最初的想法,但我无法从他的示例中看出表有多大。如果这是一次性的,而且桌子的大小可以控制,那么这可能是最简单的方法。