MySQL 对 2 个表的内部/外部连接进行更新

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

我正在尝试使用 where 子句对 2 个表的内部联接进行更新。 我目前有一个半工作更新。如果 2 个条件为真,我只想更新表。我想我需要有 1 个内部连接和 1 个外部连接才能执行此操作,但我不确定该怎么做。

我有一组带选秀权的门票,我想将 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;

最佳答案

试试这个:

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

关于MySQL 对 2 个表的内部/外部连接进行更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36105626/

相关文章:

php - MySQL 上每个用户的单个 SQLite 数据库?

java - 在jsp中设置复选框的位置

mysql - mysql跨表删除

php - 如何将 MySql 时间戳列更新为 PHP 上的当前时间戳?

sql-server - SQL 服务器 : How to automatically adjust an out-of-range value for a column when insert/update?

sql - 带子查询的SQL更新语法

php - 使用 WHERE 子句检查一个 SQL 查询中的数组中的值

mysql - Union 和 join 子句返回重复值

java - Sun 的 Thread.join 方法是否因为使用 Thread 对象同步而损坏?

mysql - 是否可以使用mysql脚本获取列表对象的数据?