【问题标题】:Update table depending on value without overlapping field names根据值更新表而不重叠字段名称
【发布时间】:2013-12-13 12:09:41
【问题描述】:

我有两张桌子:

Table A with system values
------------------------
id  |  val_1  |  val_2 |
------------------------
 1  |   11    |   22   |
------------------------

Table B with user values
-----------------------
uid  |  set  |  val_3 |
-----------------------
 21  |   1   |   11   |
-----------------------
 68  |   2   |   22   |
-----------------------
 83  |   1   |   11   |
-----------------------

我想用表 A 的 val_1val_2 的值来更新表 B 中的 val_3,根据在表 B 中设置

所以如果我更改:表 A val_1 => 333,表 A val_2 => 666,更新查询将表 B 更改为:


uid  |  set  |  val 3 |
-----------------------
 21  |   1   |   333  |
-----------------------
 68  |   2   |   666  |
-----------------------
 83  |   1   |   333  |
-----------------------

这可以在一个查询中实现吗? 现在我做:

$result=$mysql->query('SELECT val1,val2 from TABLE A WHERE id=1');
UPDATE TABLE B set val3=$result[0] WHERE set=1
UPDATE TABLE B set val3=$result[1] WHERE set=2

也许我可以做一个CASE WHEN,但如果没有表 A 的相应行值,我不知道该怎么做。

【问题讨论】:

    标签: mysql sql if-statement sql-update case


    【解决方案1】:

    使用 JOIN 进行更新:-

    UPDATE TableB
    CROSS JOIN TableA
    SET TableB.val_3 = CASE WHEN TableB.`set` = 1 THEN TableA.val_1 ELSE TableB.`set` = 2 THEN TableA.val_2 END
    WHERE TableA.id=1
    AND TableB.`set` IN (1,2)
    

    【讨论】:

    • 效果不错!现在我有另一个问题。我有两个可行的解决方案:你的和来自@Aziz Shaikh 的一个。而作为一个mysql菜鸟,哪一个是最好的? :-)
    • 他需要子查询。当数据量大幅增加时,这些可能会表现不佳(即 MySQL 获得一组结果,然后在内部为每一行执行另一个查询),但他的解决方案对于经验较少的人来说也可能更容易阅读SQL。
    • 我只是在想:@Aziz Shaikhs 解决方案是否需要 MySQL 每次都查找 val1/val2 的值,而你的不是。所以我是对的。感谢您的解释和回答!
    • 较新版本的 MySQL 可能会设法优化单独查找每个值的需要,但我不确定。如果您将查询修改为 SELECT 语句,那么您可以对它们使用 EXPLAIN 来检查差异(例如 EXPLAIN SELECT CASE WHEN TableB.set = 1 THEN TableA.val_1 ELSE TableB.set = 2 THEN TableA.val_2 END FROM TableB CROSS JOIN TableA WHERE TableA.id=1 AND TableB.set IN (1,2) )
    【解决方案2】:

    试试这个:

    UPDATE TableB
    SET val3 = 
       CASE set
         WHEN 1 THEN (SELECT val1 FROM TableA WHERE id=1)
         WHEN 2 THEN (SELECT val2 FROM TableA WHERE id=1)
       END
    

    【讨论】:

    • 效果不错!现在我有另一个问题。我有两个可行的解决方案:你的和来自@Kickstart 的一个。而作为一个mysql菜鸟,哪一个是最好的? :-)
    【解决方案3】:
      UPDATE Table_B
       SET val_3 = 
       CASE set
       WHEN 1 THEN (SELECT val_1 FROM Table_A WHERE id=1)
       WHEN 2 THEN (SELECT val_2 FROM Table_A WHERE id=1)
       END
    

    【讨论】:

    • val_3 的值取决于set 的值。请参阅上面@Aziz Shaikh 的回答。
    • 这种情况下检查 val_3,如果是 11,则从 val_1 列的表 A 中设置您的值,与 22 相同
    • val_3 始终为 11 或 22 是正确的,但它可以是任何值,具体取决于 val_1 和 val_2 的值
    • 好的,那么你需要这样做,更新类似于 Aziz Shaikh 先生
    猜你喜欢
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 2013-12-10
    • 2023-03-30
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 2020-07-07
    相关资源
    最近更新 更多