【问题标题】:MySQL update on inner/outer join over 2 tablesMySQL 更新内/外连接超过 2 个表
【发布时间】:2016-03-19 18:40:53
【问题描述】:

我正在尝试使用 where 子句对 2 个表的内部联接进行更新。 我目前有一个半工作更新。如果两个条件为真,我只想更新一个表。我想我需要有 1 个内部和 1 个外部加入才能做到这一点,我不知道该怎么做。

我有一组带有选择的票,我想将 45 添加到具有特定选择但不包括另一个选择的票中。

如果票有 team_ID = 31 而不是 team_ID = 49 的选择,则将 45 添加到 rd_1 如果票有选择,其中 team_ID = 49 而不是 team_ID = 31 将 45 减去 rd_1 如果一张票两者都不做 如果一张票既没有什么也不做

门票

ID | rd_1 |
1  | 100  |  
2  | 105  | 
3  | 155  | 

挑选

ID | ticket_ID | team_ID
1  |    1      | 31
2  |    1      | 49
3  |    2      | 31
4  |    2      | 10    
5  |    3      | 49
6  |    3      | 50

预期结果

门票

ID | rd_1 |
1  | 100  | 
2  | 150  |  
3  | 110  | 

这是我尝试过的。 这将为所有 team_ID 为 49 的选秀添加 45。从这里我想排除 team_ID =31 的选秀

UPDATE database.ticket t INNER JOIN
       database.picks p
       ON t.ID = p.ticket_ID
    SET t.rd_1 = t.rd_1 +45
WHERE p.team_ID = 49;

【问题讨论】:

    标签: mysql join sql-update inner-join outer-join


    【解决方案1】:

    试试这个:

    UPDATE  ticket t
    LEFT JOIN picks p1 ON t.ID = p1.ticket_ID AND p1.team_ID = 31
    LEFT JOIN picks p2 ON t.ID = p2.ticket_ID AND p2.team_ID = 49
    SET t.rd_1 = CASE
                    WHEN p1.ID IS NOT NULL AND p2.ID IS NULL THEN t.rd_1 + 45
                    WHEN p1.ID IS NULL AND p2.ID IS NOT NULL THEN t.rd_1 - 45
                    ELSE t.rd_1
                 END;
    

    第一个LEFT JOIN 返回匹配的31 记录,第二个返回匹配的49 记录。 CASE 表达式检查是否确实存在任何匹配项并相应地更新 rd_1 字段。

    Demo here

    【讨论】:

    • 您的回答非常完美。你甚至给了我一个可以使用的新工具,所以你得到了支持。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-05-27
    • 2020-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    相关资源
    最近更新 更多