Mysql 使用ORDER BY、LIMIT和多个表更新语法
学习SQL,如果这是初级的,很抱歉。试图为以下伪代码找出一个有效的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中的用户
更新解决方案:
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;
这非常有效。注意:这不适用于临时表-从手册:您不能在同一查询中多次引用临时表。
这是从