关于内部/外部联接的MySQL更新超过2个表

时间:2016-03-19 18:40:54

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

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

我有一组带选秀权的门票,我想在有特定选秀权的门票中添加45,而不包括另一个。

如果某个票证的行数为team_ID = 31而不是team_ID = 49,则将45添加到rd_1 如果一张票具有team_ID = 49而不是team_ID = 31的票数减去45到rd_1 如果一张票都没有做任何事 如果一张票既没有什么也没用

enter image description here

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;

1 个答案:

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