Php MySQL中用于根据另一个字段的最大值更新字段的嵌套select语句出现错误

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

我想在PhP中执行以下SQL语句。我已将其简化如下。我想知道MySQL的修改,使其工作。我尝试了一些方法,比如给表格添加别名,但没有成功:

     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
with
join
是MySQL特有的(SQL Server和Postgres支持
update
/
join
,但使用
from
子句)。如果您能对此做出回应,将不胜感激。我不明白t11别名的重要性?我问这个问题的原因是,我本以为同一个更新会经过多次,但第二次就不会了。返回第二次更新但第一次正确更新的零行。不需要
t11
别名。我认为MySQL不会在新值与旧值相同时记录“更新”。@Samir。事实上,它在MySQL的不同版本中发生了变化。我不记得是哪条路了,但你可以通过谷歌找到答案。