Mysql 使用ORDER BY、LIMIT和多个表更新语法

Mysql 使用ORDER BY、LIMIT和多个表更新语法,mysql,syntax,sql-update,Mysql,Syntax,Sql Update,学习SQL,如果这是初级的,很抱歉。试图为以下伪代码找出一个有效的更新解决方案: UPDATE tableA SET tableA.col1 = '$var' WHERE tableA.user_id = tableB.id AND tableB.username = '$varName' ORDER BY tableA.datetime DESC LIMIT 1 上述内容更像是SELECT语法,但我基本上是在更新tableA的最新一行中的一个列值,其中tableB.username中的用户

学习SQL,如果这是初级的,很抱歉。试图为以下伪代码找出一个有效的
更新
解决方案:

UPDATE tableA 
SET tableA.col1 = '$var'
WHERE tableA.user_id = tableB.id
AND tableB.username = '$varName'
ORDER BY tableA.datetime DESC LIMIT 1
上述内容更像是
SELECT
语法,但我基本上是在更新tableA的最新一行中的一个列值,其中tableB.username中的用户名(由$varName表示)链接到tableB.ID中的ID号,该ID号作为tableA.user\u ID中的ID存在

希望这是有道理的。我猜某种类型的
连接是必要的,但是子查询对于
更新来说似乎很麻烦。我知道当更新涉及多个表时,
ORDER BY
LIMIT
是禁止的。。。但我需要功能。有办法解决这个问题吗


有点困惑,请提前感谢。

解决方案是将ORDERBY和LIMIT嵌套在FROM子句中,作为join的一部分。这样,您可以首先找到要更新的确切行(ta.id),然后提交更新

UPDATE tableA AS target
    INNER JOIN (
      SELECT ta.id
      FROM tableA AS ta
        INNER JOIN tableB AS tb ON tb.id = ta.user_id
        WHERE tb.username = '$varName'
        ORDER BY ta.datetime DESC
        LIMIT 1) AS source ON source.id = target.id
    SET col1 = '$var';
向Baron Schwartz,a.k.a.Xaprb致敬,感谢他就这一主题发表的精彩文章:

您可以使用以下查询语法:

update work_to_do as target
   inner join (
      select w. client, work_unit
      from work_to_do as w
         inner join eligible_client as e on e.client = w.client
      where processor = 0
      order by priority desc
      limit 10
   ) as source on source.client = target.client
      and source.work_unit = target.work_unit
   set processor = @process_id;

这非常有效。

注意:这不适用于临时表-从手册:
您不能在同一查询中多次引用临时表。
这是从