使用大小写和子查询MySql更新多个表

时间:2016-12-01 15:29:22

标签: php mysql subquery case multiple-tables

我正在重构一些代码,这是一个PHP-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”分开,但我需要“case when”来更新单个查询中的多个表,因为它们就像11个表。

2 个答案:

答案 0 :(得分:0)

您是否尝试将其全部放在一个查询中以提高性能?在这种情况下,这将无济于事,因为如果每个子查询单独执行,它将花费相同的时间。

如果您在PHP代码中确定了表名,然后将其传递给更简单的查询字符串,那么您将获得更清晰的代码和更好的性能。

答案 1 :(得分: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

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

请记住,您可以使用“where”进行不同类型的连接和播放。在“case”子句中,更新列是必需的,而不是可选的,因此当我不需要更新该列时,我使用“else”中的相同列将其保留为默认值。