【问题标题】:Update and select a field based on a foreignt table that contains several rows based on the most recent register更新并选择基于包含基于最新寄存器的多行的外部表的字段
【发布时间】:2019-10-31 16:49:28
【问题描述】:

我有下一个查询问题和下一个更新问题: 我的主要用户表如下(我只显示重要字段):

+----------------------+
|id|name |collective_id|
+----------------------+
|1 |dark |NULL         |
+----------------------+
|2 |thor |NULL         |
+----------------------+
|3 |vinky|NULL         |
+----------------------+

以及以users.id(FK为contrats.user_id)命名的contracts与users相关的外部表:

-------------------------------------------------
|id|user_id|ts_from|ts_expire|type|collective_id|
-------------------------------------------------
|1 |1      |1000000|2000000  |1   |NULL         |
|2 |1      |1000001|2000001  |1   |NULL         |
|3 |1      |1000001|2000001  |3   |15           |
|4 |1      |1000002|2000002  |3   |8            |
|5 |2      |1000000|2200000  |2   |NULL         |

我要的查询结果是下一个:

-----------------------
|user_id|collective_id|
-----------------------
|1      |8            |
|2      |NULL         |
|3      |NULL         |

结果是两个表的联合,与字段 contracts.user_id=users.idLEFT JOIN 相关,但注意 collective_idts_expire 字段在 contracts 表中的最新字段并且具有 @ 987654329@,这就是为什么为user_id1 选择的collective_id8,而不是15 并且其他用户不包含任何collective_id,因为他们与@ 没有任何合同987654336@。你明白吗?

与此问题相关的最后一个问题是我的 users 表也包含一个 collective_id 字段,应该使用此值进行更新,UPDATE 查询应该如何基于此条件更新 users.collective_id 字段?

非常感谢

Daniel 来自巴塞罗那(php 编程专家,不熟悉 mysql 复杂查询)

我已经测试了几个查询,但没有成功:

UPDATE `users` 
SET `collective_id` = (
    SELECT `collective_id` 
    FROM `contrats` 
    WHERE 
        `vigency` = 1 
        AND `type` = 3 
        AND `user_id` = 1 
    ORDER BY `ts_expire` DESC 
    LIMIT 1
) 
WHERE `users`.`id`=1;

这有效,但仅适用于指定的一个用户,而不是整个用户表。

UPDATE `users` u, contracts 
LEFT JOIN (
    SELECT `user_id`, `collective_id` 
    FROM `contratos` 
    WHERE 
        `users_id`= u.`id` 
        AND `vigency`= 1 
        AND `type` = 3
) contracts ON contracts.`user_id`=u.`id` 
SET `collective_id` = contracts.`collective_id` 
WHERE 1;

通过使用相同的值更新整个 users.collective_id,这会出错。

【问题讨论】:

    标签: mysql sql sql-update


    【解决方案1】:

    对于选择查询,您可以left join 并使用相关子查询进行过滤:

    select 
        u.user_id,
        c.collective_id
    from users u
    left join contrats c
        on  c.user_id = u.user_id
        and c.vigency = 1
        and c.type = 3
        and c.ts_expire = (
            select max(ts_expire)
            from contracts c1
            where 
                c1.user_id = c.user_id 
                and c1.vigency = c.vigency 
                and c1.type = c.type
        )
    

    您的更新查询即将完成,您只需将子查询与外部查询关联

    update users u set collective_id = (
        select collective_id 
        from contrats c
        where 
            c.vigency = 1 
            and c.type = 3 
            and c.user_id = u.user_id
            order by c.ts_expire 
            desc limit 1
        )
    

    请注意,这将设置为子查询为空的null 记录。

    【讨论】:

    • 成功了!谢谢!更新很有意义,但是 SELECT 推导出来很奇怪,但确实有效
    猜你喜欢
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 2014-06-29
    • 2011-08-05
    • 2021-02-04
    • 2017-01-26
    • 1970-01-01
    • 2016-08-19
    相关资源
    最近更新 更多