2016-12-01 64 views
0

我重构了一些代码,这是一个PHP-MYSQL项目。所以我试图在单个查询中更新一些表,或者至少两个。使用大小写和子查询更新多个表MySql

这是可能实现不加入?什么是最好的选择?

UPDATE document D SET D.status = 2, 
    CASE 
     WHEN D.type 'A' THEN (UPDATE table_1 SET active = 1 WHERE id_table1 = D.id_document) 
     WHEN D.type 'B' THEN (UPDATE table_2 SET active = 1 WHERE id_table2 = D.id_document) 
     WHEN D.type 'C' THEN (UPDATE table_3 SET active = 1 WHERE id_table3 = D.id_document)    
    END 
WHERE D.id_document = %s 

我不介意到第一台“文件d”分开,但我需要“情况下,当”更新单个查询多个表,因为它们就像11个表。

回答

0

不离开回答此问题。基于我研究的内容。

  • 不,您不能在子查询中执行“更新”。
  • 不,你不能使用这样的“案例”。

是可以做的唯一事情是:

使用加入更新多个表

UPDATE table_1 
INNER JOIN table_2 ON table_1.id = table_2.id 
INNER JOIN table_3 ON table_3.id = table_3.id 
SET table_1.column = '', table_2.column = '' 
WHERE any condition; 

而且“情况”只能在一个单一的方式

UPDATE table SET 
column = CASE columX WHEN 'A' THEN '2' ELSE column END, 
column2 = CASE columX WHEN 'B' THEN '2' ELSE column2 END 
使用

结合这两者,我能够实现我所需要的。

记住,你可以让不同类型的加盟,并与“里”玩。在“case”子句中,更新列是强制性的,而不是可选的,所以当我不需要更新该列时,我使用“else”中的同一列将其保留为默认值。

0

你试图把它们都放在一个查询以提高性能?这在这种情况下无济于事,因为如果每个子查询分别执行,它将花费相同的时间。

,如果你在你的PHP代码确定表名称,然后通过你会得到更清洁的代码和更好的性能是上一个更简单的查询字符串。

+0

这旧的代码有这么多的“mysqli_query()”调用,就像32只是简单的重复更新。只是想减少线路的数量。此外,我使用简单的SQL快速复制/粘贴来做测试。 我可以把表放在一个数组中并构建并执行。我试图避免建立与PHP的SQL –

+0

对不起,有没有办法做到这一点与MySQL中的一个查询。到目前为止,最干净的代码解决方案是从变量中传递表名。更好的办法是纠正糟糕的数据库模式设计,并使所有这些表成为一张表,这样一次简单的更新就可以完成这项工作。但既然你说这是旧代码,在这种情况下很可能是不切实际的。 –

+0

它可能存在“选择更新”?更多更多的子查询?不需要在一个查询中。其他表格“table1,table2”等等,真的不同,不能合并。就像一个用于收款,其他用于付款,其他用于发票等,只在他们之间共享一个列名。 –