【问题标题】:UPDATE Syntax with ORDER BY, LIMIT and Multiple TablesORDER BY、LIMIT 和多个表的 UPDATE 语法
【发布时间】:2012-05-11 02:07:32
【问题描述】:

正在学习 SQL,如果这是初级的,请见谅。试图为以下伪代码找出一个有效的UPDATE 解决方案:

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_id 中。

希望这是有道理的。我猜某种JOIN 是必要的,但子查询对于UPDATE 来说似乎很麻烦。我知道ORDER BYLIMIT 在UPDATE 中涉及多个表时是禁区……但我需要这个功能。有没有办法解决这个问题?

有点困惑,提前谢谢。

【问题讨论】:

    标签: mysql syntax sql-update


    【解决方案1】:

    解决方案是将 ORDER BY 和 LIMIT 嵌套在 FROM 子句中作为连接的一部分。这让您首先找到要更新的确切行 (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(又名 Xaprb)致敬,感谢他就这个确切主题发表了出色的文章: http://www.xaprb.com/blog/2006/08/10/how-to-use-order-by-and-limit-on-multi-table-updates-in-mysql/

    【讨论】:

    • 注意:这不适用于临时表 - 来自手册:You cannot refer to a TEMPORARY table more than once in the same query.
    【解决方案2】:

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

    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;
    

    这很好用。

    【讨论】:

    猜你喜欢
    • 2018-02-21
    • 2014-09-10
    • 1970-01-01
    • 2011-10-16
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    相关资源
    最近更新 更多