0

我正在尝试运行这个:

$stmt=$cxn->prepare("UPDATE table1 SET used='1' WHERE prim_id != 
     (SELECT MAX(prim_id) FROM table1 WHERE email='email12345@gmail.com')");
$stmt->execute(array());

但它会导致 MySQL 错误:#1093 - You can't specify target table 'table1' for update in FROM clause.

搜索此错误后,似乎In MySQL, you can't modify the same table which you use in the SELECT part..

如何更改该查询以使其正常工作?

非常感谢提前

4

2 回答 2

1

您的查询只是缺少一些逻辑。将其更改为:

UPDATE table1
SET used='1'
WHERE `email` = 'email12345@gmail.com'
  AND prim_id != (
    SELECT MAX(prim_id) 
    FROM table1
    WHERE email='email12345@gmail.com')
于 2012-07-14T02:02:12.580 回答
1

试试这个:

UPDATE table1 t1, (SELECT MAX(prim_id) AS max_prim_id
                     FROM table1 WHERE email='email12345@gmail.com') tmp
SET t1.used='1'
WHERE t1.prim_id != tmp.max_prim_id
AND t1.`email` = 'email12345@gmail.com'

它删除子查询并使用常规临时表来存储表“tmp”的结果。该查询需要 2 个表进行更新:

  • table1(别名为 t1)
  • 一个临时表(别名为 tmp)

WHERE 子句:

  • 指示两个表是如何连接的
  • 限制表 t1 中要考虑的记录

SET 子句说只有 t1.used 会被更新。

更新语句

于 2012-07-14T02:28:14.183 回答