来自连接表的 MySQL 更新语句(受该表的最新值限制)

Posted

技术标签:

【中文标题】来自连接表的 MySQL 更新语句(受该表的最新值限制)【英文标题】:MySQL Update Statement from joined table (limited by latest value of that table) 【发布时间】:2020-04-29 21:25:51 【问题描述】:

我正在使用 MariaDB 5.5

我有 2 个表,我想根据表 B 上的信息更新表 A 中的一列。

表 B 有多个我要查找的 ID 条目,但每个注册表都有一个 updated_at 列,所以我只想获取最新的注册表。

select po_number, sce_status
from infor_order
where po_number = @po
order by updated_at desc;

这将产生以下数据集,我只对“分配的部分”感兴趣

所以我想要做的是更新表 A 中的一列,通过“po_number”搜索表 B 的最新值,但是当我尝试进行选择以测试连接时,我得到表 B 的 2 个值每个注册表

select b.id, b.PO_NUMBER, b.INFOR_SCE_STATUS, infor.sce_status
from planning_backloguov b
left join (
    select distinct po_number, sce_status
    from infor_order
    order by updated_at desc
) infor on b.PO_NUMBER = infor.po_number
where b.PO_NUMBER = @po;

如果我向左连接子查询添加“限制 1”,我不会从子查询中得到任何结果。

TL;DR:我只想根据表 B 中的最新值更新表 A 中的一列,以获取这两个表之间的共享 ID 列。

【问题讨论】:

我的问题最后有一个SQL查询示例 【参考方案1】:

如果我正确地关注了您,您可以使用相关子查询从表infor_order 中检索po_numberpo_number 的最新sce_status,如下所示:

update planning_backloguov pb
set pb.sce_status = (
    select io.sce_status
    from infor_order io
    where io.po_number = pb.po_number
    order by io.updated_at desc
    limit 1
)

如果您需要更新多个列,那就另当别论了。在这种情况下,您需要加入和过滤:

update planning_backloguov pb
inner join infor_order io on io.po_number = pb.po_number
set 
    pb.sce_status = io.sce_status,
    pb.some_other_column = io.some_other_column  -- change to the actual column name
where io.updated_at = (
    select max(io1.updated_at)
    from infor_order io1
    where io1.po_number = io.po_number
)

【讨论】:

是的,我忘了添加该信息,我使用了该方法并且它确实有效,但我需要从同一个表中更新更多列,因此如下所示: update planning_backloguov pb set pb.sce_status = ( select io.sce_status from infor_order io where io.po_number = pb.po_number order by io.updated_at desc limit 1), pb.sce_order = ( select io.sce_order from infor_order io where io.po_number = pb.po_number order by io.updated_at desc限制 1) @JorgeLimas:嗯,这是一个完全不同的问题。我用另一种解决方案更新了我的答案。

以上是关于来自连接表的 MySQL 更新语句(受该表的最新值限制)的主要内容,如果未能解决你的问题,请参考以下文章

更新一个表的字段值等于另一个表的字段值的SQL语句要怎么写?

MySQL - 如何创建一个新表,该表是两个现有表的主键的连接

MySQL——添加更新与删除数据

更新一个表的字段值等于另一个表的字段值的SQL语句

Python mysql-表的创建,删除和更新

使用 when 语句创建更新触发器