MySQL从另一个表中的最新字段更新字段

MySQL从另一个表中的最新字段更新字段,mysql,mysql-workbench,Mysql,Mysql Workbench,我一直在尝试实现解决方案时遇到问题,我认为这是一个简单的查询 设置: 表1:UID,字段1,时间戳 表2:UID、fk_表1UID、字段1、时间戳 表1有一个on before update触发器,它将整个旧行插入表2中。(有效地保留表1的变更日志) 表2还有一个外键约束,用于将fk_table1UID设置为table1.UID 问题: 我所要做的就是构建一个查询 (伪代码) 更新table1.Field1,其中UID=X(用户输入) 具有 table2.Field1,其中table2.Time

我一直在尝试实现解决方案时遇到问题,我认为这是一个简单的查询

设置:

表1:UID,字段1,时间戳

表2:UID、fk_表1UID、字段1、时间戳

表1有一个on before update触发器,它将整个旧行插入表2中。(有效地保留表1的变更日志)

表2还有一个外键约束,用于将fk_table1UID设置为table1.UID

问题:

我所要做的就是构建一个查询

(伪代码) 更新table1.Field1,其中UID=X(用户输入) 具有 table2.Field1,其中table2.TimeStamp=max(table2.TimeStamp)和table2.fk_table2UID=table1.UID

我尝试过使用内部联接进行不同的更新尝试,但遇到了一个问题,即无法引用已调用的表或其他内容。(我相信与我的扳机有关.)

问题:

如何在一次呼叫查询中实现这一点?

试试以下方法:

UPDATE table1
       SET table1.Field1 = (SELECT table2.Field1 FROM table2 WHERE table2.UIDfk = X ORDER BY table2.TimeStamp DESC LIMIT 1)
WHERE table1.UID = X
试试这个:

UPDATE table1
       SET table1.Field1 = (SELECT table2.Field1 FROM table2 WHERE table2.UIDfk = X ORDER BY table2.TimeStamp DESC LIMIT 1)
WHERE table1.UID = X

与返回所需值的子查询联接

UPDATE table1 AS t1
JOIN (SELECT Field1 FROM table2
      WHERE fk_table1UID = @X
      ORDER BY TimeStamp DESC
      LIMIT 1) AS t2
SET t1.Field1 = t2.Field1
WHERE UID = @X

与返回所需值的子查询联接

UPDATE table1 AS t1
JOIN (SELECT Field1 FROM table2
      WHERE fk_table1UID = @X
      ORDER BY TimeStamp DESC
      LIMIT 1) AS t2
SET t1.Field1 = t2.Field1
WHERE UID = @X

你确定这样行吗?MySQL对何时可以在子查询中使用
LIMIT
有限制,我想这可能是其中之一。不确定,我不是MySQL专家,但这种查询将分别在使用ROWNUM和TOP的ORACLE和SQL Server上工作。你确定可以工作吗?MySQL对何时可以在子查询中使用
LIMIT
有限制,我想这可能是其中之一。不确定,我不是MySQL专家,但这种查询将分别在ORACLE和SQL Server上使用ROWNUM和TOP进行。嗨,DarbyM,如果你的答案是Barmar的,我很满意,但请告诉我我的答案是否有效。用于学习目的。谢谢。:)嗨,DarbyM,如果你对Barmar的答案做了标记,我会很满意,但请告诉我我的答案是否有效。用于学习目的。谢谢。:)今天晚些时候,我会在电脑前再试一次。但我认为这样做有一个问题,因为表1也有一个更新表2的触发器。在我看来,整个操作可能必须在事务中完成。因此,我可以同时锁定表2中的一行和表1中的一行,并将表2中的结果设置为一个变量,在表1更新中使用该变量。问题是我没有使用启动事务,所以我不熟悉如何执行。每个查询都是在自己的事务中自动完成的。如果将事务拆分为单独的查询,则只需要一个事务。今天晚些时候,我将再次尝试此操作。但我认为这样做有一个问题,因为表1也有一个更新表2的触发器。在我看来,整个操作可能必须在事务中完成。因此,我可以同时锁定表2中的一行和表1中的一行,并将表2中的结果设置为一个变量,在表1更新中使用该变量。问题是我没有使用启动事务,所以我不熟悉如何执行。每个查询都是在自己的事务中自动完成的。只有将事务拆分为单独的查询时,才需要它。