Php MySQL中用于根据另一个字段的最大值更新字段的嵌套select语句出现错误
我想在PhP中执行以下SQL语句。我已将其简化如下。我想知道MySQL的修改,使其工作。我尝试了一些方法,比如给表格添加别名,但没有成功:Php MySQL中用于根据另一个字段的最大值更新字段的嵌套select语句出现错误,php,mysql,nested,max,Php,Mysql,Nested,Max,我想在PhP中执行以下SQL语句。我已将其简化如下。我想知道MySQL的修改,使其工作。我尝试了一些方法,比如给表格添加别名,但没有成功: update T1 set col1 = 500 where col2 = 12345 and col3 = (select max(col3) from T1 where col2 = 12345) 我想更新一个记录,其中一列的最大值为。整个查询只涉及一个表。如果相关的话,我正在使用P
update T1 set col1 = 500
where col2 = 12345 and
col3 = (select max(col3) from T1 where col2 = 12345)
我想更新一个记录,其中一列的最大值为。整个查询只涉及一个表。如果相关的话,我正在使用PDO
给出的错误是:
#1093 - You can't specify target table 'T1' for update in FROM clause
使用
连接
:
update T1 join
(select max(col3) as maxcol3
from T1 t11
where col2 = 12345
) tmax
on T1.col3 = tmax.maxcol3 and
T1.col2 = 12345
set T1.col1 = 500;
此版本的可能副本涉及更新。完全不同的野兽。请看下面@Gordon的答案。哇!我还以为我懂SQL呢!它起作用了。我对真正的查询有点问题,但我已经解决了。我也花了一些时间来理解语法,因为我更习惯于“where”的用法,在这种用法中,集合出现在更新tablename之后。非常感谢。@Samir。您的原始语法是标准SQL,适用于大多数数据库。这种形式的
update
withjoin
是MySQL特有的(SQL Server和Postgres支持update
/join
,但使用from
子句)。如果您能对此做出回应,将不胜感激。我不明白t11别名的重要性?我问这个问题的原因是,我本以为同一个更新会经过多次,但第二次就不会了。返回第二次更新但第一次正确更新的零行。不需要t11
别名。我认为MySQL不会在新值与旧值相同时记录“更新”。@Samir。事实上,它在MySQL的不同版本中发生了变化。我不记得是哪条路了,但你可以通过谷歌找到答案。