【问题标题】:Update mutiple tables using case and subquery MySql使用案例和子查询 MySql 更新多个表
【发布时间】:2016-12-01 15:29:21
【问题描述】:

我正在重组一些代码,这是一个 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

我不介意将第一个表“document D”分开,但我需要“case when”在单个查询中更新多个表,因为它们就像 11 个表。

【问题讨论】:

    标签: php mysql subquery case multiple-tables


    【解决方案1】:

    您是否试图将所有这些都放在一个查询中以提高性能?在这种情况下这将无济于事,因为它将花费与单独执行每个子查询相同的时间。

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

    【讨论】:

    • 这段旧代码有很多“mysqli_query()”调用,比如32个只是为了简单的重复更新。只是想减少行数。我还使用简单的 sql 进行快速复制/粘贴来进行测试。我可以将表放在一个数组中并构建和执行。我试图避免使用 php 构建 sql
    • 对不起,没有办法在 mysql 中使用一个查询来做到这一点。到目前为止,最简洁的代码解决方案是从变量中传入表名。更好的办法是纠正糟糕的数据库模式设计,并使所有这些表成为一个表,这样一个简单的更新就可以完成这项工作。但既然你说这是旧代码,在这种情况下可能不切实际。
    • 它可能存在“选择更新”吗?更多子查询?不需要在一个查询中。其他表“table1,table2”等确实不同,无法合并。就像一个用于收据,另一个用于付款,另一个用于发票等,它们之间只共享一个列名。
    • 那么这意味着这些表之间共享的列应该在它自己的表中。所有差异都可以在单独的表中。
    【解决方案2】:

    不要让问题悬而未决。根据我的研究。

    • 不,您不能在子查询中进行“更新”。
    • 不行,不能这样用“case”。

    唯一能做的就是:

    使用连接更新多个表

    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;
    

    而“case”只能单用

    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”中的同一列将其保留为默认值。

    【讨论】:

      猜你喜欢
      • 2010-11-26
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      • 2019-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多